2014-04-25 54 views
1

我想测试一个字符串的所有模式匹配的几个单词是单词的开头。如果不是所有模式都匹配,我想将查询视为False。单词测试的开始正在起作用,但是我得到了重复的匹配,我觉得很惊讶,因为一旦找到一个单词匹配,就不会再对该单词进行测试。也许我需要以某种方式将测试限制为一场比赛。PHP preg_match_all与多个字

我想象,如果我是测试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] 
+0

如果我没有理解好要检查所有的话只存在一个时间? –

+0

不,我想知道模式中的所有单词至少匹配一次。 – mcl

回答

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!'; 
+0

这在我的测试返回0。 – mcl

+0

@mcl:你是否用“bob”修正了“bod”? –

+0

对不起,我错过了。我现在得到1的回报,这可能是我想要的。我会做进一步的测试并回来。 – mcl

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]); 
+0

据我所知,字符串在任何单词的开始处必须包含“bob”,“bug”和“sled” - 全部**,或返回false - 如果** any * *这些词语在任何词的开头都有;而不是要求他们都在某个地方。 – CD001

+0

一个有趣的结果。 'bob'匹配一次,'sled'匹配一次,但'bug'不匹配。什么是一个空白字符的添加? – mcl

+0

现在它应该工作正常 –