2009-01-19 4 views
1

J'ai une expression régulière comme celui-ci (très simplifié):correspondant infini d'un sous-expressions (expressions régulières) retourne qu'un seul match

^(ab)*$ 

Et suis en correspondance par ceci:

abababababababab 

Quand je exécuter par preg_match:

preg_match('/$(ab)*$/', 'abababababababab', $matches); 
print_r($matches); 

Je reçois ceci:

Array 
(
    [0] => abababababababab 
    [1] => ab 
) 

wheras Je pense ceci:

Array 
(
    [0] => abababababababab 
    [1] => ab 
    [2] => ab 
    [3] => ab 
    [4] => ab 
    [5] => ab 
    [6] => ab 
    [7] => ab 
    [8] => ab 
} 

Comment puis-je obtenir ce que je pense?

(Notez que le sous-expression pourrait être plus compliqué, par exemple ([aA][bB]), et je veux que les expressions adaptées à leur ordre dans le sujet.)

Répondre

4

le faire en utilisant preg_match_all comme ceci:

preg_match_all('/(ab)/', 'abababababababab', $matches); 
print_r($matches); 

Rappelez-vous que preg_match fournit uniquement la première correspondance et que preg_match_all a les mêmes fonctionnalités, mais retourne tout. Notez également que maintenant l'expression régulière a changé. Si vous utilisez l'astérisque, il faudra probablement consommer toute la chaîne sur le premier match. Vous pouvez, cependant, essayer quelque chose comme (ab)*? pour le rendre non-croyant.

+0

Cela fonctionne très bien. Merci! – strager

+0

Pas de problème. Bonne chance avec tout ce que vous essayez d'accomplir, strager. ;-) –

Questions connexes