2010-01-02 10 views
2

我想出了如何检查OR病例,preg_match("/(word1|word2|word3)/i", $string);。我无法弄清楚的是如何匹配AND情况。我想检查该字符串是否包含所有术语(不区分大小写)。如何匹配在PHP中使用正则表达式的所有术语?

+2

相关:http://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator – miku 2010-01-02 19:04:35

回答

5

这是可能使用先行,例如:

preg_match('/^(?=.*word1)(?=.*word2)(?=.*word3)/i', $string) 
然而

做一个和匹配在一个单一的正则表达式,它可能更清晰,也许更快地只是做外正则表达式:

preg_match('/word1/i', $string) && preg_match('/word2/i', $string) && preg_match('/word3/i', $string) 

或者如果您的目标字符串像word1那样简单:

stripos($string, 'word1')!==FALSE && stripos($string, 'word2')!==FALSE && stripos($string, 'word3')!==FALSE 
+0

+1为多个正则表达式。人们以某种​​方式总是忘记他们的源代码在考虑正则表达式时可能包含多行。这就像一个所有软件都是Perl单行程的世界。 – slebetman 2010-01-02 19:17:11

+0

绝对多个匹配,分裂的问题往往是把一个复杂的正则表达式变成一个微不足道的解决方案 – 2010-01-02 20:12:09

0

如果您知道的条款将出现的顺序,你可以使用类似以下内容:

preg_match("/(word1).*(word2).*(word3)/i", $string); 

如果没有定义的术语的顺序,你可能会使用3个独立的表达是最好的并检查他们全部匹配。一个表达是可能的,但可能很复杂。

0
preg_match("/word1.*word2.*word3)/i"); 

这工作,但他们必须出现在规定的顺序,你当然可以替代preg_match("/(word1.*word2.*word3|word1.*word3.*word2|word2.*word3.*word1| word2.*word1.*word3|word3.*word2.*word1|word3.*word1.*word2)/i");

但是那漂亮herendous,你就必须要疯了!会更好只使用strpos($haystack,$needle);在一个循环,或多个正则表达式匹配。

1

我想在你的问题的情况下可使用情况下会引起一些问题:

情况是这样的

words = "abcd","cdef","efgh" 

确实有字符串匹配:

string = "abcdefgh" 

也许你不应该使用REG.EXP

+0

相当不错的观察。 – 2011-05-13 09:48:05

相关问题