我有一个名字的数组:
$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);
答案 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';
}
}
根本没有测试过。