如何使用PHP中的正则表达式匹配所有术语?

时间:2010-01-02 18:55:31

标签: php regex preg-match

我想出了如何检查OR案例preg_match( "/(word1|word2|word3)/i", $string );。我无法弄清楚如何匹配AND案例。我想检查字符串是否包含所有术语(不区分大小写)。

4 个答案:

答案 0 :(得分:5)

可以使用lookahead在单个正则表达式中进行AND匹配,例如:

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

答案 1 :(得分:1)

我在考虑使用案例可能导致问题的问题:

这是情况

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

必须匹配字符串:

string = "abcdefgh"

也许你不应该使用REG.EXP

答案 2 :(得分:0)

如果您知道条款的显示顺序,可以使用以下内容:

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

如果未定义术语的顺序,您可能最好使用3个单独的表达式并检查它们是否匹配。单个表达式是可能的,但可能很复杂。

答案 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");

但那很可爱,你必须疯狂!在循环中使用strpos($haystack,$needle);或多个正则表达式匹配会更好。