2010-09-18 7 views

Répondre

2

Les séquences [\s]{1} * que vous utilisez pour correspondre à un chevauchement des espaces entre les matchs. L'espace de fin après "AA " est le même espace que celui précédant " BB". N'importe quel caractère ne peut être trouvé qu'une seule fois, donc après que l'analyse a trouvé " AA ", il recherche seulement la chaîne "BB " restante pour trouver une correspondance, et n'en trouve pas. Essayez la séquence d'échappement de limite de mot \b à la place. Cela correspond au début et la fin des mots, mais ne consomme par de caractères, il peut donc correspondre à plusieurs reprises:

preg_match_all('/\b(AA|BB|CC)+\b/', 'AA BB', $matches); 

L'utilisation \b a pour effet de bonus ne nécessitant pas l'espace supplémentaire que vous aviez autour de votre chaîne. Vous pouvez simplement passer au 'AA BB' au lieu de ' AA BB ' si vous le souhaitez.

* Par ailleurs, [\s]{1} est la même chose que [\s], qui est identique à un \s simple. Pas besoin de crochets carrés ou bouclés.

+0

Une limite de mot sera également correspond (par exemple) 'AA; BB; CC', qui peuvent être des faux positifs. – Matthew

0

Le problème est que vous essayez de faire correspondre deux fois le même espace. L'utilisation d'un regard vers l'avenir (? = \ S) devrait aider:

preg_match_all('/\s(AA|BB|CC)(?=\s)/',' AA BB CC BB AA ',$matches);