Regex – PHP Lookaround

Tengo una cadena, como esta:

$foo = 'Hello __("How are you") I am __("very good thank you")' 

Sé que es una cadena extraña, pero quédate conmigo por favor: P

Necesito una expresión de expresiones regulares que busque el contenido entre __ (“Buscar contenido aquí”) y ponerlo en una matriz.

es decir, la expresión regular encontraría “¿Cómo estás?” y “Muy bien gracias”.

Prueba esto:

 preg_match_all('/(?< =__\(").*?(?="\))/s', $foo, $matches); print_r($matches); 

lo que significa:

 (?< = # start positive look behind __\(" # match the characters '__("' ) # end positive look behind .*? # match any character and repeat it zero or more times, reluctantly (?= # start positive look ahead "\) # match the characters '")' ) # end positive look ahead 

EDITAR

Y como Greg mencionó: alguien que no está demasiado familiarizado con las miradas, podría ser más legible dejarlos fuera. A continuación, combina todo: __(" , la cadena y ") y ajusta la expresión regular que coincide con la cadena ,. .*? , entre paréntesis para capturar solo esos personajes. A continuación, deberá obtener sus coincidencias a través de $matches[1] . Una demostración

 preg_match_all('/__\("(.*?)"\)/', $foo, $matches); print_r($matches[1]); 

Si desea utilizar la sugerencia de Gumbo, se le acredita el patrón:

 $foo = 'Hello __("How are you")I am __("very good thank you")'; preg_match_all('/__\("([^"]*)"\)/', $foo, $matches); 

Asegúrate de usar $matches[1] para tus resultados, a menos que quieras los resultados completos de la cadena también.

var_dump() de $matches :

 array 0 => array 0 => string '__("How are you")' (length=16) 1 => string '__("very good thank you")' (length=25) 1 => array 0 => string 'How are you' (length=10) 1 => string 'very good thank you' (length=19)