2010-09-18 9 views

Odpowiedz

2

W [\s]{1} sekwencje * używasz dopasować białymi nakładania między meczów. Końcowa przestrzeń po "AA " jest tą samą przestrzenią, co wcześniejsza niż " BB". Dowolny znak można dopasować tylko jeden raz, więc po zeskanowaniu znajdzie " AA " przeszukuje tylko pozostały ciąg znaków "BB " i nie uda się go znaleźć.

Zamiast tego wypróbuj sekwencję ucieczki z granicą wyrazu \b. Dopasowuje początki i końce słowach, ale w rzeczywistości nie spożywać żadnych znaków, dzięki czemu można dopasować kilka razy:

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

Korzystanie \b ma dodatkowy efekt, że nie wymaga dodatkowych spacji trzeba było otaczający swój ciąg. Możesz po prostu przekazać 'AA BB' zamiast ' AA BB ', jeśli chcesz.

* Nawiasem mówiąc, [\s]{1} to samo, co [\s], który jest taki sam jak zwykły \s. Nie ma potrzeby stosowania kwadratowych lub nawiasów klamrowych.

+0

Słowo granica będzie również dopasowanie (np.) 'AA; BB; CC', które mogą być fałszywie dodatnie. – Matthew

0

Problem polega na tym, że próbujesz dwukrotnie dopasować to samo miejsce. Korzystanie spojrzeć na przodzie (= s \) powinna pomóc:

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