Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP搜索结果突出显示脚本_Php_Highlight - Fatal编程技术网

PHP搜索结果突出显示脚本

PHP搜索结果突出显示脚本,php,highlight,Php,Highlight,假设我在我的网站上搜索“古代帝国的故事”。 我的数据库正在进行全文搜索,结果出来了。我有这个突出显示的功能 function sublinhamos($text, $words) { // explode the phrase in words $wordsArray = explode(' ', $words); // loop all searched words foreach($wordsArray as $word) { //hig

假设我在我的网站上搜索“古代帝国的故事”。 我的数据库正在进行全文搜索,结果出来了。我有这个突出显示的功能

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;
}
函数sublinhamos($text,$words){
//用词破译这个短语
$wordsArray=爆炸(“”,$words);
//循环所有搜索的单词
foreach($wordsArray作为$word){
//突出显示
$text=str_-ireplace($word,“.strtoupper($word)。”,$text,$count);
} 
//右击结果
返回$text;
}
这并不太糟糕,但这里的问题是因为搜索术语是“古代帝国的故事”,当stru_ireplace找到已经插入的SPAN时,它遇到了搜索术语中的“an”单词,并打破了SPAN标记

我需要突出显示一个单词的部分,所有单词至少两个字符,但除了旧的SPAN遇到问题之外,这一切都很好


有什么想法吗?

您可以用一个临时字符串替换它,这样就不会搜索它(例如{{{和}}}}),如下所示:

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

标记完所有点击后,您只需简单地替换span标记的临时字符串即可。首先,我不会使用span

<mark></mark>

是更好的使用元素。它的目的是突出显示像这样的文本部分。有关更多信息,请参阅

此外,还可以将数组传递到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;
}
函数sublinhamos($text,$words){
$wordsArray=array();
$markedWords=array();
//用词破译这个短语
$wordsArray=爆炸(“”,$words);
foreach($wordsArray作为$k=>$word){
$markedWords[$k]=''.$word';
}
$text=str_ireplace($wordsArray,$markedWords,$text);
//右击结果
返回$text;
}

您可以使用带负片后视的preg_替换:

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

后面的第一个查找是起始跨距标记,第二个查找是结束标记。可能您可以将它们组合成一个,但不确定。

您尝试过类似的方法吗

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

@mishu他刚刚注意到了这一点。他的解决方案是不在一个循环中替换,而是立即使用一个数组。我喜欢它。+1刚刚对它进行了测试,结果很奇怪(为测试而创建)上面有mark这个词,搜索mark并没有破坏输出…所以可能这就是答案…很好,我只是遇到了另一个问题,尽管与@Nick answer无关。再次以“古代帝国的故事”为例“古代”一词将被标记为第一个An,其余部分将保持不亮状态…我想这是一个全新的问题…无论如何,答案是可以接受的..谢谢你可以按大小排序单词sarray(最大的第一个)在foreach循环之前。这应该可以。@Flo@Nick我发现对数组的顺序进行排序对我来说效果很好。做了很多测试,几乎所有测试都很好。在搜索“Ma Mark”的地方只发现了一个bug。在那里它打破了
。尽管我没有看到这样的搜索;)哈哈