PHP突出显示搜索关键字使用preg_replace与数组

时间:2011-04-30 08:35:35

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

我在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);
}

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

2 个答案:

答案 0 :(得分:2)

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

$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 ...

答案 1 :(得分:0)

你试着改变吗?

$m[0]

$m[0][0]