【问题标题】:Regular expression with multiple search strings具有多个搜索字符串的正则表达式
【发布时间】:2015-09-15 13:42:20
【问题描述】:

我有一个名称数组:

$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);

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 可能会根据您当前的尝试提供帮助。
  • 如果任何现有元素是'Will',当$str = "Ferrell Will" 时也应该匹配吗?
  • 如果在原始数组中有“William Ferrell”,它是否应该匹配“Will Ferrell”?
  • 对不起,伙计。我现在将我的尝试添加到原始问题。

标签: php regex


【解决方案1】:

您可以通过使用 preg_grep 和来自 needle 的映射正则表达式来避免循环遍历值:

$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 调用中找到大海捞针中的所有单词。

【讨论】:

    【解决方案2】:

    我没有看到任何用例 - 但我认为可能的解决方案将涉及一些爆炸、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';
        }
    }
    

    根本没有测试。

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2018-10-07
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多