2010-03-09 4 views
4

J'ai une chaîne, comme ceci:Regex - PHP lookaround

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

Je sais que c'est une chaîne étrange, mais rester avec moi s'il vous plaît: P

je besoin d'une expression regex qui cherchera le contenu entre __ ("Rechercher du contenu ici") et le mettre dans un tableau.

Par exemple, l'expression régulière trouverait "Comment allez-vous" et "très bien merci".

+0

__ __ devrait fonctionner (<= __ \ (") * (=.?" \)?). – anomareh

Répondre

7

Essayez ceci:

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

qui signifie:

(?<=  # 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 

EDIT

Et comme Greg dit: quelqu'un pas trop familier avec le regard contournements, il pourrait être plus facile à lire pour les laisser dehors. Vous devez ensuite faire correspondre tous les éléments: __(", la chaîne et ") et entourer l'expression rationnelle correspondant à la chaîne , .*?, entre parenthèses pour capturer uniquement ces caractères. Vous devrez alors obtenir vos matchs si $matches[1]. Une démo:

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

Vous monsieur êtes incroyable. – Flukey

+1

Ne serait-il pas plus simple d'utiliser '/__\("(.*?)"\)/', puis d'extraire le groupe correspondant? Je trouve toujours ces matches lookbehind et lookahead difficiles à lire. –

+0

Pourquoi, merci Jamie, content de savoir qu'il y a au moins une personne de plus qui pense que je suis, en plus de mon fils de 2,5 ans! :) –

2

Si vous souhaitez utiliser la suggestion de Gumbo, le crédit lui va pour le modèle:

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

preg_match_all('/__\("([^"]*)"\)/', $foo, $matches); 

Assurez-vous d'utiliser $matches[1] pour vos résultats, sauf si vous voulez que les résultats de chaîne complète aussi.

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)