2010-09-18 19 views

Antwort

2

Die [\s]{1} Sequenzen * Sie verwenden zwischen den Spielen Leerzeichen Überlappung zu entsprechen. Der nachgestellte Abstand nach "AA " ist derselbe wie der vor " BB". Jedes Zeichen kann nur einmal abgeglichen werden, so dass nach der Suche " AA " nur die verbleibende Zeichenfolge "BB " nach einer Übereinstimmung gesucht wird und keine gefunden wird.

Versuchen Sie stattdessen die Wortgrenzen-Escape-Sequenz \b. Dies entspricht den Anfang und das Ende von Wörtern, verbrauchen aber nicht wirklich alle Zeichen, so kann es mehrere Male entsprechen:

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

Mit \b hat den Bonus Wirkung nicht erfordert, um die zusätzlichen Leerzeichen Sie Ihre Schnur hatte umgibt. Sie können einfach 'AA BB' statt ' AA BB ' übergeben, wenn Sie es wünschen.

* By the way, ist [\s]{1} dasselbe wie [\s], die die gleiche wie eine einfache \s ist. Keine Notwendigkeit für die eckigen oder geschweiften Klammern.

+0

eine Wortgrenze wird auch Übereinstimmung (z.B.) "AA; BB; CC", was falsch positive sein könnte. – Matthew

0

Das Problem ist, dass Sie versuchen, das gleiche Leerzeichen zweimal zu vergleichen. Mit einem Blick in die Zukunft (? = \ S) sollten helfen:

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