PHP preg_match_all有多个单词

时间:2014-04-25 12:44:31

标签: php regex preg-match-all

我正在尝试为几个单词的所有模式匹配测试一个字符串,这些单词是单词的开头。如果并非所有模式都匹配,我想将查询视为False。单词测试的开始是有效的,但是我得到了重复的匹配,我发现令人惊讶的是,一旦找到一个单词的匹配,它就不会再测试该单词了。也许我需要以某种方式将测试限制在一个匹配。

我想象如果我测试3个单词,那么成功的测试将返回3个。

从示例中可以看出,返回值具有误导性。我得到一个正值,它大于我测试的单词数。在非匹配组的情况下,由于某些单词的多个匹配,我仍然得到高于要测试的单词数的值。

我想我还没有完全明白某事或某种程度上我需要强迫一个AND情况。

我已经搜索了答案,但似乎没有一个问题可以解决。

$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]

2 个答案:

答案 0 :(得分:1)

您可以使用多个前瞻:

$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!';

答案 1 :(得分:0)

试试这个

$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]);