2

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

4

4 回答 4

5

可以使用前瞻在单个正则表达式中进行 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
于 2010-01-02T19:10:19.557 回答
1

我正在考虑您的问题中可能会导致使用案例出现问题的情况:

这是情况

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

确实必须在字符串中匹配:

string = "abcdefgh"

也许你不应该使用 REG.EXP

于 2010-01-02T19:18:58.417 回答
0

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

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

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

于 2010-01-02T19:10:01.743 回答
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);在循环或多个正则表达式匹配中使用会更好。

于 2010-01-02T19:10:34.207 回答