包含多个搜索字符串的正则表达式

时间:2015-09-15 13:42:20

标签: php regex

我有一个名字的数组:

$arr = array('Mark Whalberg', 'Will Ferrell', 'Mel Gibson', 'Tom Cruise');

然后我有一个字符串。该字符串可以包含1个或多个字符串。所以它可以爆炸。例如:

$str = "Will Ferrell";

$str = "Ferrell Will";

$str = "Ferrell";

我需要的是遍历$ arr并选择其中与我的字符串匹配的所有名称。

所以如果字符串包含:

$str = "Will Ferrell";

$str = "Ferrell";

$str = "ferrell Will";

然后将获取数组中的第二个元素。 正则表达式是我认为的关键。我找不到的是如何使用字符串的爆炸部分制作单个表达式。

编辑: 请不要关心迭代和类似的东西。问题只是关于将爆炸字符串与数组中的元素进行比较的正则表达式。

编辑:

抱歉的家伙。这是我的尝试:

$arr = array('Mark Whalberg', 'Will Ferrell', 'Mel Gibson', 'Tom Cruise');
$str = "Will Ferrell";

for($i=0;$i<count($arr);$i++){
if (preg_match('/'.$arr[$i].'/i',$str)){
    echo $str . ' found';
}
}

此代码有效但仅在匹配准确时才有效。如果我改为:

$str = "Ferrell Will";

然后我没有结果。

编辑:

最后我想出了一个解决方案。但是,我担心它不是最好的方法。我做双重迭代。很高兴听到你们的评论:

$arr = array('Mark Whalberg', 'Will Ferrell', 'Mel Gibson', 'Tom Cruise', 'William Ferrell');
$str = "Ferrell Will";
$exploded_str = explode(' ', $str);

$found_array = array();
for($i=0;$i<count($arr);$i++){
$found = 0;
for($x=0;$x<count($exploded_str);$x++){
    if (preg_match('/'.$exploded_str[$x].'/i',$arr[$i])){
        $found++;
    }    
}
if($found == count($exploded_str)){
    $found_array[count($found_array)] = $arr[$i];
}
}

print_r($found_array);

2 个答案:

答案 0 :(得分:2)

您可以通过使用带有映射正则表达式的preg_grep来避免循环使用值:

$arr = array('Mark Whalberg', 'Will Ferrell', 'Mel Gibson', 'Tom Cruise');

$str = "Ferrell Will";

print_r(preg_grep('/' . join('', array_map(function($v) { return '(?=.*'.$v.')'; },
        explode(' ', $str))) .'/', $arr));

<强>输出:

Array
(
    [1] => Will Ferrell
)

而且:

$str = "Will Ferrell";

print_r(preg_grep('/' . join('', array_map(function($v) { return '(?=.*'.$v.')'; },
        explode(' ', $str))) .'/', $arr));

<强>输出:

Array
(
    [1] => Will Ferrell
)

join with array_map正在从搜索字符串中创建此外观正则表达式:

(?=.*Ferrell)(?=.*Will)

这将确保在preg_grep调用中找到大海捞针中的所有单词。

答案 1 :(得分:0)

我没有看到任何用例 - 但我认为可能的解决方案会涉及一些爆炸性的,strtolowering和array_diffing:

$arr = array('Mark Whalberg', 'Will Ferrell', 'Mel Gibson', 'Tom Cruise');
$str = "Will Ferrell";
$compare = array_map('strtolower', explode(" ", $str));

foreach($arr as $lookup)
{
    $lookup_arr = array_map('strtolower', explode(" ", $lookup));
    if(count(array_diff($compare, $lookup_arr)) == 0) {
        echo $str . ' found';
    }
}

根本没有测试过。