preg_match_all('/[\s]{1}(AA|BB|CC)+[\s]{1}/',' AA BB ',$matches);
résultat
est AA
, mais je dois AA
et BB
.PHP: regex preg_match ne pas trouver des chaînes correctes
preg_match_all('/[\s]{1}(AA|BB|CC)+[\s]{1}/',' AA BB ',$matches);
résultat
est AA
, mais je dois AA
et BB
.PHP: regex preg_match ne pas trouver des chaînes correctes
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.
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);
Vous pouvez faire un coup d'œil derrière-positif:
/(?<=\s)(AA|BB|CC)+\s/
Ressources:
Une limite de mot sera également correspond (par exemple) 'AA; BB; CC', qui peuvent être des faux positifs. – Matthew