PHP preg_match_all с несколькими словами

Я пытаюсь проверить строку на наличие всех совпадений с образцом нескольких слов, которые являются началом слов. Если не все шаблоны совпадают, я хочу рассматривать запрос как False. Начало проверки слов работает, но я получаю повторяющиеся совпадения, что мне кажется удивительным, поскольку я думал, что после того, как для слова было найдено одно совпадение, оно больше не будет проверять это слово. Возможно, мне нужно как-то ограничить тесты одним матчем.

Я представил, что если бы я тестировал 3 слова, то успешный тест вернул бы 3.

Как видно из примера, возвращаемые значения вводят в заблуждение. Я получаю положительное значение, которое больше, чем количество слов, которые я тестирую. В случае несоответствующей группы я все еще получаю значение выше, чем количество слов, которые нужно проверить, из-за множественных совпадений некоторых слов.

Я предполагаю, что я что-то не до конца понял или как-то мне нужно форсировать ситуацию И.

Я искал ответы в Google, но ни один из них не подходит для моей проблемы.

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';

$result = preg_match_all($query, $image, $matches);

$query = '#\b(bob|bug|sled)#i';  // ALL MATCH
Return Value 6 [ bob x 3, bug x 1, sled x 1]

$query = '#\b(bob|bug|led)#i'; // Two matches 'led' fails
Return Value 4 [ bob x 3, bug x 1, led x 0]

person mcl    schedule 25.04.2014    source источник
comment
Если я правильно понимаю, вы хотите проверить, присутствуют ли все слова только один раз?   -  person Casimir et Hippolyte    schedule 25.04.2014
comment
Нет, я хочу знать, что все слова в образце совпадают хотя бы один раз.   -  person mcl    schedule 25.04.2014


Ответы (2)


Вы можете использовать несколько предпросмотров:

$text = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';   
$pattern = '~(?=.*\bbob)(?=.*\bbug)(?=.*\bsled)~i';   
if (preg_match($pattern, $text)) echo 'OK!';
person Casimir et Hippolyte    schedule 25.04.2014
comment
Это возвращает 0 в моем тесте. - person mcl; 25.04.2014
comment
Извините, я пропустил это. Теперь у меня есть возврат 1, и, возможно, это то, что я хочу. Я сделаю дальнейшее тестирование и вернусь. - person mcl; 25.04.2014
comment
Выглядит неплохо. Я отмечу это как ответ завтра, если не смогу обвинить его за ночь. - person mcl; 25.04.2014
comment
Я не могу придраться к ответу, поэтому отмечу как правильный - большое спасибо. @CD001 - спасибо, что указали на preg_match_all неправильный подход. - person mcl; 25.04.2014

попробуй это

$image = 'After A!!BC DEF hello bugggy bad Sled bob bobert robob Triumph 2000 Roadster clearing bobby Sledmere ^ August 2014 ^ error';

$query = '#\b(bob|bug|sled)(.*?) #i';  // ALL MATC

preg_match_all($query, $image, $matches);

print_r($matches[0]);
person alreadycoded.com    schedule 25.04.2014
comment
Насколько я понимаю вопрос, строка должна содержать bob, bug и sled в начале любого слова - все из них или возвращать false - это будет оцениваться как истина, если любой из этих терминов присутствуют в начале любого слова; вместо того, чтобы требовать их всех где-то. - person CD001; 25.04.2014
comment
Интересный результат. «bob» совпало один раз и «sled» совпало один раз, но «bug» не совпало. Что делает добавление пустого символа? - person mcl; 25.04.2014
comment
Извините, что вернулся к исходной ситуации, давая значение 6. bobx3, sledx2, bugx1 - person mcl; 25.04.2014