【问题标题】:PHP Highlight Search Keywords Using preg_replace With an ArrayPHP 使用带有数组的 preg_replace 突出显示搜索关键字
【发布时间】:2011-08-15 23:39:04
【问题描述】:

我正在使用here的这个函数,即:

// highlight search keywords 
function highlight($title, $search) {
preg_match_all('~\w+~', $search, $m);
if(!$m)
    return $title;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';

return preg_replace($re, '<span style="background-color: #ffffcc;">$0</span>', $title);
}

效果很好,但仅适用于标题。我希望能够传递一个包含 $title 和 $description 的数组。

我正在尝试这样的事情:

$replacements = array($title, $description);

// highlight search keywords 
function highlight($replacements, $search) {
preg_match_all('~\w+~', $search, $m);
if(!$m)
    return $replacements;
    $re = '~\\b(' . implode('|', $m[0]) . ')\\b~i';

return preg_replace($re, '<span style="background-color: #ffffcc;">$0</span>', $replacements);
}

它不工作。它传递一个数组作为标题,而不是突出显示描述(尽管它实际上是返回一个描述)。知道如何让它工作吗?

【问题讨论】:

标签: php preg-replace highlight preg-match-all


【解决方案1】:

我个人会将原始函数保留为仅对一个参数而不是数组进行操作。它会让你的调用代码变得清晰明了;

$titleHighlighted = highlight($title, $searchKeywords);
$descriptionHighlighted = highlight($title, $searchKeywords);

但是,我会重写您的函数以使用 str_ireplace 而不是 preg_replace;

function highlight($contentBlock, array $keywords) {
        $highlightedContentBlock = $contentBlock;

        foreach ($keywords as $singleKeyword) {
                $highlightedKeyword = '<span class = "keyword">' . $singleKeyword . '</span>';
                $highlightedContentBlock = str_ireplace($singleKeyword, $highlightedKeyword, $highlightedContentBlock);
        }   

        return $highlightedContentBlock;
}

这个重写的函数应该更易于阅读,并且没有编译正则表达式的开销。对于任何内容块(标题、描述等),您可以多次调用它;

$title = "The quick brown fox jumper over ... ";

$searchKeywords = array("quick", "fox");
$titleHighlighted = highlight($title, $searchKeywords);

echo $titleHighlighted; // The <span class = "keyword">quick</span> brown ...

【讨论】:

  • 非常感谢您的帮助,并且提醒您 str_ireplace() 比正则表达式更快。
  • 这对于像“aa”这样的搜索查询不起作用,因为关键字是“a”和“a”,而对于第一个关键字,html 看起来像“ a”,对于下一个关键字“a”,它将破坏 HTML 并提供“an> ...”,它实际上将替换“包含在“”字符串中的“a”也..
【解决方案2】:

你尝试过改变吗?

$m[0]

$m[0][0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 2012-02-23
    • 1970-01-01
    • 2021-09-19
    • 2014-03-07
    • 1970-01-01
    • 2010-09-16
    • 2010-12-10
    相关资源
    最近更新 更多