0

我有以下数据集:

names = ["brad pitt", "george clooney", "james cameron"];

我需要一个匹配“brad pitt”和“george clooney”的正则表达式:

"brad peter clooney"

此外,它应该匹配:"brad pitt"当查询是,"brad peter pitt"

请注意,我使用的是 PHP,我可以拆分查询并对其进行操作。例如我可以试试这个:

((brad)+.*(peter)+.*(pitt)+.*+)

但它不会匹配,因为我在每个名称后面都有 1 个或更多,如果它放 *(0 或更多)它会匹配所有记录,因为它也意味着不匹配。

4

2 回答 2

0

所以你想匹配一个字符串,如果它有任何单词。为此,您可以拆分字符串\s+并在表达式中使用每个单词,例如:

word1|word2|word3

您可能还想添加一些\bs 和/i,例如(//这次引用):

/\b(?:word1|word2|word3)\b/i

或者您可以使用三个单独的表达式或indexOf()检查。

于 2013-05-31T05:21:03.480 回答
0

好的,这是一个简单的想法:

$arr = array("brad pitt", "george clooney", "james cameron");
$str = "brad peter clooney";

foreach($arr as $val)
{
   $tmpptrn = str_replace(" ", "|", $val);
   $pattern = "/($tmpptrn)/i";

   if(preg_match_all($pattern, $str, $matches))
   {
       //do whatever with the results

       $match = $matches[1][0];
       if(!empty($match))
       {
           $arra[] = array_filter($arr, function($el) use ($match) { return ( strpos($el, $match) !== false ); });

       }

   }
}

//print out the results
print_r($arra);
于 2013-05-31T05:50:05.120 回答