我在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);
}
它不起作用。它传递一个数组作为标题,而不是突出显示描述(虽然它实际上返回了一个描述)。知道如何让这个工作吗?
答案 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]