Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: preg_match regex not finding correct strings

Tags:

regex

php

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

result is AA, but I need AA and BB.

like image 233
user451555 Avatar asked Sep 18 '10 19:09

user451555


1 Answers

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.

like image 195
John Kugelman Avatar answered Nov 15 '22 01:11

John Kugelman