PHP regex y comparar variables en una cadena

Tengo un problema difícil y parece que estoy atascado. Tengo una idea de cómo proceder, pero no tengo idea de cómo hacerlo en la práctica.

Lo que quiero hacer es convertir una cadena dentro de un archivo .txt a otro formato (¿usando expresiones regulares y variables?). El principal problema es cuando necesito convertir esas líneas marcadas con // comentarios.

NOTA: “… villainx calls $ x” se calcula de forma diferente en el original y en el formato en que se debe convertir. Y ese es el problema, necesito ayuda seria.

Ejemplo: esto necesita ser convertido …

HERO posts small blind $0.50. villain4 posts big blind $1.00. ** Dealing down cards ** Dealt to HERO [ 7s 8c 5d 8d ] villain1 calls $1.00 villain2 raises to $3.00 // total sum a player raises to villain3 calls $3.00 HERO calls $3.00 villain4 calls $3.00 villain1 calls $3.00 // total sum a player calls whether he has put money in to the pot before (as he has -- $1 call, first to act) ** Dealing Flop ** [ 9c, Ah, Jh ] 

…a esto:

 HERO posts small blind [$0.50 USD]. villain4 posts big blind [$1.00 USD]. ** Dealing down cards ** Dealt to HERO [ 7s 8c 5d 8d ] villain1 calls [$1.00 USD] villain2 raises [$3.00 USD] // total sum a player raises to villain3 calls [$3.00 USD] HERO calls [$2.50 USD] // a sum player calls = last raise ($3) - money put in (=$0.50 small blind) villain4 calls [$2.00 USD] // $3 - $1 (big blind) villain1 calls [$2.00 USD] // $3 - $1 (the call first to act) ** Dealing Flop ** [ 9c, Ah, Jh ] 

Otro ejemplo:

 HERO posts small blind $0.50. villain4 posts big blind $1.00. ** Dealing down cards ** Dealt to HERO [ 7s 8c 5d 8d ] villain1 bets $5.50 villain2 raises to $20.00 villain3 raises to $40.00 villain1 calls $40.00 //THIS NEEDS TO BE "calls $34.50" villain2 calls $40.00 //THIS NEEDS TO BE "calls $20.00" ** Dealing Flop ** [ 9c, Ah, Jh ] 

y aquí está el ejemplo completo de cómo debe verse toda la mano. El archivo Txt puede contener cientos de manos. Me las arreglé para reproducir básicamente todos los demás problemas, excepto el anterior. Estoy perdido. ¡Por favor, ayúdame! :RE

 ***** Hand History for Game 335502358 ***** (Full Tilt) $100.00 USD PL Omaha - Thursday, October 15, 01:32:21 ET 2009 Table Foxtrot (Real Money) Seat 3 is the button Seat 1: villain1 ( $38.50 USD ) Seat 2: villain2 ( $99.65 USD ) Seat 3: villain3 ( $415.55 USD ) Seat 4: HERO ( $99.00 USD ) Seat 6: villain4 ( $171.20 USD ) HERO posts small blind [$0.50 USD]. villain4 posts big blind [$1.00 USD]. ** Dealing down cards ** Dealt to HERO [ 7s 8c 5d 8d ] villain1 calls [$1.00 USD] villain2 raises [$3.00 USD] villain3 calls [$3.00 USD] HERO calls [$2.50 USD] villain4 calls [$2.00 USD] villain1 calls [$2.00 USD] ** Dealing Flop ** [ 9c, Ah, Jh ] HERO checks villain4 checks villain1 checks villain2 bets [$8.00 USD] villain3 folds HERO folds villain4 calls [$8.00 USD] villain1 folds ** Dealing Turn ** [ Th ] villain4 checks villain2 bets [$13.00 USD] villain4 calls [$13.00 USD] ** Dealing River ** [ 3c ] villain4 checks villain2 checks villain2 shows [Qc, Js 8s Qd ] villain4 shows [Kh, Tc 7h Kd ] villain4 wins $54.15 USD from main pot 

edición 1: se agregó NOTA para aclarar mi verdadera pregunta

edición 2: agregó otro ejemplo

Solutions Collecting From Web of "PHP regex y comparar variables en una cadena"

¿Podría usar un preg_match para sacar el valor en dólares y reorganizar la cadena con un preg_replace?

 $regex = '/(\$[0-9.]+)/'; $matched = preg_match($regex, $stringToMatch, $matches); if($matched > 0) { $output string = preg_replace($regex, '['.$matches[0].' USD]', $stringToMatch); } 

Lo único que no hará es ignorar las líneas al principio donde declaras cada ‘asiento’, así que es posible que tengas que filtrarlos primero [los strpos simples ($ stringToMatch, ‘Seat’) podrían ser suficientes allí, no maravillosamente elegantes aunque].

OK, voy a tener otra oportunidad. Esto se escribirá en una especie de cosa php / psuedocode.

 while($line = get the next line) { if($line contains 'seat') { $player = get player from $line $pool = get player pool from $line $bettingMatrix[$player]['pool'] = $pool; } else if($line contains 'blind') { $player = get player from $line $betValue = get blind value from $line $bettingMatrix[$player]['betTotal'] = $betValue $bettingMatrix['pot'] += $betValue //keep a sum of the pot } else if($line contains 'raises') { $player = get player from $line $betValue = get value from $line $betMade = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount raised by $bettingMatrix[$player]['betTotal'] = $betValue //$line contains total bet this hand (shortcut) $bettingMatrix['raiseValue'] = $betMade $bettingMatrix['pot'] += $betMade //keep a sum of the pot } else if($line contains 'calls') { $player = get player from $line //if player has called, can work out bet from raiseValue $betMade = $bettingMatrix['raiseValue'] $bettingMatrix[$player]['betTotal'] += $betMade $bettingMatrix['pot'] += $betMade //keep a sum of the pot } else if(substr($line, 0, 3) == ' Wins ') //probably do something about players named Wins :) { //assume all bets resolved foreach($bettingMatrix[$player]) { update pool. zero betTotal } zero pot, zero raiseValue } } 

erm, es bastante difícil y listo, y probablemente no lo clasifique como un Analizador como tal, pero de todos modos sirve para calcular todos los valores que necesitas. Las 2 $ betMade variables deberían terminar con los valores que desea.

Editar: Acabo de notar que no funciona si nadie sube y todos simplemente llaman o se retiran (y probablemente muera horriblemente si todos se retiran o lo que sea). Necesita un poco más de trabajo, pero es la esencia general, llámalo una respuesta a medias. Lo siento.