PHP stripos没有返回所有位置

时间:2017-12-03 02:01:44

标签: php strpos

我将返回stripos函数匹配的所有数组,如此

$requestedservice = request('service');
$result_array = array_filter($allservicesname, function($item) use ($requestedservice) {
return (stripos($item, $requestedservice) !== false);
        });

这仅适用于第一次出现,例如 - 如果大便是Walk dance and rock,如果针是Walk它会再次Walk dance and rock,但如果针是Walk rock它不会返回Walk dance and rock。为什么会这样?

有没有办法找到所有匹配项,以便它与干草堆Walk dance and rock匹配针Walk rock

如果针是Walk run,它应该与Walk dance and rock不匹配,这是一种正常的用例

2 个答案:

答案 0 :(得分:2)

看起来您将能够通过一系列不区分大小写的关键字检查来实现所需的过滤。

代码:(Demo

$allservicesname=['dance','Walk rock','Walk dance and rock','Walk'];  // array of haystacks

$requestedservice='walk rock';  // string of needles

$result_array=array_filter($allservicesname,function($string)use($requestedservice){
    foreach(explode(' ',$requestedservice) as $keyword){
        if(stripos($string,$keyword)===false){
            return false;
        }
    }
    return true;
});

var_export($result_array);

输出:

array (
  1 => 'Walk rock',
  2 => 'Walk dance and rock',
)

请注意,原始键保留在输出数组中。另外,我应该提到关键字可以按任何顺序出现并保持准确性。

或者,如果你不被正则表达式的想法吓到,preg_grep()可以简明扼要地完成这项任务。它是用于在每个元素上使用正则表达式过滤数组的函数。

代码:(Demo)(Regex Pattern Demo

$allservicesname=['Walk dance and rock walk','dance','walk','rock and walk','sidewalk and rockwall'];  // array of haystacks

$requestedservice='walk rock';  // string of needles
$pattern='/(?=.*\Q'.str_replace(' ','\E)(?=.*\Q',$requestedservice).'\E)/i';  // with literal substring matching, no wordboundaries
//$pattern='/(?=.*\b\Q'.str_replace(' ','\E\b)(?=.*\b\Q',$requestedservice).'\E\b)/i';  // with wordboundaries  
echo $pattern,"\n";

$result_array=preg_grep($pattern,$allservicesname);

var_export($result_array);

输出:

/(?=.*\Qwalk\E)(?=.*\Qrock\E)/i
array (
  0 => 'Walk dance and rock walk',
  3 => 'rock and walk',
  4 => 'sidewalk and rockwall',
)

如果您不希望元素[4]符合条件,那么字边界是必要的 - 改为使用第二个(注释掉的)模式声明。

\Q..\E确保正则表达式中没有特殊含义的字符可以干扰执行。它们内部的子串被解释为#34;字面意思"。

答案 1 :(得分:0)

正如其他人所提到的,explode仅返回第一次出现。将字符串转换为包含foreach的数组后,您可以使用in_array循环enter image description here来完成您要查找的内容。

这是行动:

$all_services = explode(" ", "walk dance and rock");
$requested_services = explode(" ", "walk rock");
$result_array = array();

foreach ($all_services as $service) {
    if (in_array($service, $requested_services)) {
        $result_array[] = $service;
    }
}