【问题标题】:multi-word search and replace in array of arrays数组数组中的多词搜索和替换
【发布时间】:2018-02-24 19:24:41
【问题描述】:

此代码属于搜索功能。用户可以输入 $search_string,下面的代码会将 html 放在字符串周围以突出显示它。搜索已扩展为包括多词搜索(如果您搜索“ifs 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']));
}

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

【问题讨论】:

  • 你能分享那个数组吗?
  • 请稍微解释一下你的问题。
  • 我已经编辑了这个问题,希望能更清楚。对于那个很抱歉。 @SahilGulati 你能重新阅读这篇文章并让我知道你是否还需要这个数组吗?
  • @miken32 这更像是一个效率问题。我的代码目前已经进行了搜索和替换。问题是,有没有办法在一次迭代中进行多词搜索和替换。

标签: php arrays regex


【解决方案1】:

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,虽然我不确定它实际上有多快——它很有可能使用相同的调用当您开始使用 C 代码时,作为 foreach 循环。

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"],
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2012-07-08
    • 2010-09-26
    • 2013-08-28
    • 2011-10-31
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多