繁体   English   中英

多字搜索和替换数组中的数组

[英]multi-word search and replace in array of arrays

此代码属于搜索功能。 用户可以输入$ search_string,下面的代码会将html放在字符串周围以突出显示它。 搜索已扩展为包括多词搜索(如果您搜索“ if ands”,则只会显示同时包含这两个词的结果)。

它搜索一个数组数组,而嵌套的数组包含我们搜索的字段:概述,过程和验证。 然后,它在数组中找到值并突出显示您搜索的单词。

foreach ($results as $s_result => $row) {
    $results[$s_result]['overview'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['overview']));
    $results[$s_result]['execution'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['execution']));
    $results[$s_result]['verification'] = str_ireplace($search_string, "<span style=\"background-color: #ff0;\">$search_string</span>", htmlspecialchars($row['verification']));
}

无需为每个搜索关键字多次遍历数组的数组,如何突出显示用户一次通过的多个单词/关键字? 也许没有办法,但我不能轻易得出这个结论。

str_replace可以将数组作为主题,因此应该可以工作:

foreach ($results as &$row) {
    $row = str_ireplace(
        $search_string,
        "<span class=\"highlight\">$search_string</span>",
        array_map("htmlspecialchars", $row)
    );
}

请注意,我们正在通过引用更改$row ,因此当您遍历$results ,它将显示更改。

当然,您无需考虑子字符串等,因此正则表达式可能更适合以下情况:

foreach ($results as &$row) {
    $row = preg_replace(
        "/\\b($search_string)\\b/i",
        "<span class=\"highlight\">$1</span>",
        array_map("htmlspecialchars", $row)
    );
}

最后,如果您真的想摆脱foreach循环,可以将array_walk与内联函数一起使用,尽管我不确定它实际上有多快–当您获得时,它很有可能使用与foreach循环相同的调用下降到C代码。

array_walk($results, function(&$v, $k) use($search_string) {
    $v = preg_replace(
        "/\\b($search_string)\\b/i",
        "<span class=\"highlight\">$1</span>",
        array_map("htmlspecialchars", $v)
    );
});

经过样本输入测试:

$search_string = "foobar";
$results = [
    ["overview"=>"some fobar text", "execution"=>"some foobr text", "verification"=>"some foobar text"],
    ["overview"=>"some fbar text", "execution"=>"some fobr text", "verification"=>"some foobarbaz text"],
];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM