6
preg_match_all('/[\s]{1}(AA|BB|CC)+[\s]{1}/',' AA BB ',$matches);

result is AA, but I need AA and BB.

3 Answers 3

2

The [\s]{1} sequences* you're using to match whitespace overlap between the matches. The trailing space after "AA " is the same space as the one before " BB". Any one character can only be matched a single time, so after the scan finds " AA " it only searches the remaining "BB " string for a match, and fails to find one.

Try the word boundary escape sequence \b instead. This matches the beginnings and ends of words but does not actually consume any characters, so it can match multiple times:

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

Using \b has the bonus effect of not requiring the extra spaces you had surrounding your string. You can just pass in 'AA BB' instead of ' AA BB ' if you wish.

* By the way, [\s]{1} is the same thing as [\s], which is the same as a simple \s. No need for the square or curly brackets.

Sign up to request clarification or add additional context in comments.

1 Comment

A word boundary will also match (e.g.) AA;BB;CC, which might be false positives.
0

The problem is you are trying to match the same space twice. Using a look ahead (?=\s) should help:

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

Comments

0

You can do a positive look-behind:

/(?<=\s)(AA|BB|CC)+\s/


Resources :

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.