PREG_MATCH检查所有单词和条件

时间:2015-07-29 15:02:16

标签: php regex preg-match

我已经写了一个正则表达式,它在OR条件下对搜索词进行分类,这样就可以在字符串中提供三个单词,而不管它们的顺序如何。现在我想要一个AND条件,因为我想在一个不同顺序的字符串中同时得到所有三个单词。

这是preg_match()常规表现。

$myPregMatch = (preg_match("/\b^(Word1|Word2|Word3)\b/", "Word4 Word2 Word1 Word3 Word5 Word7"));
 if ($myPregMatch){
    echo  "FOUND !!!";
 }

我想在字符串"Word4 Word2 Word1 Word3 Word5 Word7"中找到所有单词都在其中的顺序不同。如果样本字符串是"Word5 Word7 Word3 Word2",则它不应该返回。

2 个答案:

答案 0 :(得分:2)

你需要锚定前瞻:

^(?=.*\bWord1\b)(?=.*\bWord2\b)(?=.*\bWord3\b)

请参阅demo

如果输入字符串中有换行符号,则需要使用/s修饰符。

这是IDEONE demo

$re = '/^(?=.*\bWord1\b)(?=.*\bWord2\b)(?=.*\bWord3\b)/'; 
$str = "Word4 Word2 Word1 Word3 Word5 Word7"; 

$myPregMatch = (preg_match($re, $str));
 if ($myPregMatch){
    echo  "FOUND !!!";
 }

结果:FOUND !!!

答案 1 :(得分:2)

检查每个单词可能更快

$string = "Word4 Word2 Word1 Word3 Word5 Word7";  // input string

$what = "Word2 Word1 Word3";                      // words to test
$words = explode(' ', $what);                     // Make array

$i = count($words);
while($i--) 
   if (false == strpos($string, $words[$i])) 
     break;

$result = ($i==-1);   // if $i == -1 all words are present in input string