PHP搜索结果突出显示脚本

时间:2011-12-15 10:34:34

标签: php highlight

所以,让我说我在我的网站上搜索“古代帝国的故事”。 我的数据库正在进行全文搜索,结果出现了。我有这个功能突出强调

function sublinhamos($text, $words) {

    // explode the phrase in words
    $wordsArray = explode(' ', $words); 

    // loop all searched words
    foreach($wordsArray as $word) {
        //highlight
        $text = str_ireplace($word, "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count);
    } 
    //right trows results
    return $text;
}

这不是太糟糕,但这里的问题是因为搜索术语是“古代帝国的故事”,当str_ireplace发现已插入的SPAN时,它会遇到搜索词中的“an”字,并打破SPAN标签

我需要突出显示突出显示单词的一部分,所有单词最多两个字符,但除了旧的SPAN遇到问题外,它都很好。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

好吧,首先我不会使用跨度。

<mark></mark>

是更好的元素。它的目的是突出显示这样的文本部分。有关详细信息,请参阅this article

此外,您可以将数组传递给str_replace,例如:

function sublinhamos($text, $words) {
    $wordsArray = array();
    $markedWords = array();
    // explode the phrase in words
    $wordsArray = explode(' ', $words); 

    foreach ($wordsArray as $k => $word) {
      $markedWords[$k]='<mark>'.$word.'</mark>';
    }

    $text = str_ireplace($wordsArray, $markedWords, $text);

    //right trows results
    return $text;
}

答案 1 :(得分:1)

您可以将其替换为不会被搜索的临时字符串(例如{{{和}}}),如下所示:

$text = str_ireplace($word, "{{{".strtoupper($word)."}}}", $text, $count);

在标记所有匹配后,您只需将临时字符串简单替换为span标记

即可

答案 2 :(得分:0)

您可以使用带有负面反对的preg_replace:

$text = preg_replace('/(?<!<sp)(?<!<\/sp)(an)/i', '<span class="highlight">$1</span>', $text);

第一个后视用于启动span标记,第二个用于结束标记。可能你可以将它们组合成一个,但不确定。

答案 3 :(得分:0)

你试过这样的事吗?

$text = preg_replace("|($word)|", "<span class=\"highlight\">".strtoupper($word)."</span>", $text, $count);