2011-04-22 76 views
5

我正在为我的网站创建搜索脚本。但是我想在每个搜索结果的描述中匹配单词italic。我使用的脚本是PHP,说明段落的变量是$search_desc。目前我使用str_ireplace()函数来实现我的目标。 但是我觉得我的目标太远了!下面是函数如何在段落中查找并添加粗体字符串?

echo str_ireplace($search_query,"<i>".$search_query."</i>",$search_desc); 

但问题是,如果搜索查询search并为例如搜索结果的描述是,

这是搜索演示说明。

所以说明添加italic属性匹配的单词后显示

这是搜索演示说明。

所以你可以看到问题很大。由于原始描述被编辑!所以任何人对我的问题有任何想法?请让我知道!

+0

为了以HTML感知的方式突出显示搜索结果,相关的问题是:[忽略preg_replace中的html标记](http://stackoverflow.com/q/8193327/367456) – hakre 2012-11-22 15:48:23

回答

7

我想你想用什么的preg_replace。

http://php.net/manual/en/function.preg-replace.php

此功能允许你搜索并使用令牌被发现的字代替。像这样的东西可能会工作:

$string = "This is description for Search Demo"; 
$searchingFor = "/" . $searchQuery . "/i"; 
$replacePattern = "<i>$0<\/i>"; 
preg_replace($searchingFor, $replacePattern, $string); 

此代码可能有错误,我只是很快把它扔在一起。但我认为这是您的情况的正确理念。

+1

感谢哥们!这对我来说就像我想的一样。 – 2011-04-22 18:17:40

+0

这是一个很好的解决方案。只有在使用斜线时才有错误。 – Apalabrados 2014-07-27 16:50:49

2

我认为你可以很容易地使用JavaScript实现你的目标。试试这个:

1)包含以下代码:

<style> 
<!-- 
    SPAN.searchword { font-style:italic; } 
    // --> 
</style> 
<script type="text/javascript"> 

function stripVowelAccent(str) 
{ 
    var rExps=[ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g, 
     /[\xC8-\xCA]/g, /[\xE8-\xEB]/g, 
     /[\xCC-\xCE]/g, /[\xEC-\xEE]/g, 
     /[\xD2-\xD4]/g, /[\xF2-\xF4]/g, 
     /[\xD9-\xDB]/g, /[\xF9-\xFB]/g ]; 

    var repChar=['A','a','E','e','I','i','O','o','U','u']; 

    for(var i=0; i<rExps.length; ++i) 
     str=str.replace(rExps[i],repChar[i]); 

    return str; 
} 

/* Modification of */ 
/* http://www.kryogenix.org/code/browser/searchhi/ */ 
/* See: */ 
/* http://www.tedpavlic.com/post_highlighting_search_results_with_ted_searchhi_javascript.php */  
/* http://www.tedpavlic.com/post_inpage_highlighting_example.php */ 
/* for additional modifications of this base code. */ 
function highlightWord(node,word,doc) { 
    doc = typeof(doc) != 'undefined' ? doc : document; 
    // Iterate into this nodes childNodes 
    if (node.hasChildNodes) { 
     var hi_cn; 
     for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) { 
      highlightWord(node.childNodes[hi_cn],word,doc); 
     } 
    } 

    // And do this node itself 
    if (node.nodeType == 3) { // text node 
     tempNodeVal = stripVowelAccent(node.nodeValue.toLowerCase()); 
     tempWordVal = stripVowelAccent(word.toLowerCase()); 
     if (tempNodeVal.indexOf(tempWordVal) != -1) { 
      pn = node.parentNode; 
      if (pn.className != "searchword") { 
       // word has not already been highlighted! 
       nv = node.nodeValue; 
       ni = tempNodeVal.indexOf(tempWordVal); 
       // Create a load of replacement nodes 
       before = doc.createTextNode(nv.substr(0,ni)); 
       docWordVal = nv.substr(ni,word.length); 
       after = doc.createTextNode(nv.substr(ni+word.length)); 
       hiwordtext = doc.createTextNode(docWordVal); 
       hiword = doc.createElement("span"); 
       hiword.className = "searchword"; 
       hiword.appendChild(hiwordtext); 
       pn.insertBefore(before,node); 
       pn.insertBefore(hiword,node); 
       pn.insertBefore(after,node); 
       pn.removeChild(node); 
      } 
     } 
    } 
} 

function unhighlight(node) { 
    // Iterate into this nodes childNodes 
    if (node.hasChildNodes) { 
     var hi_cn; 
     for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) { 
      unhighlight(node.childNodes[hi_cn]); 
     } 
    } 

    // And do this node itself 
    if (node.nodeType == 3) { // text node 
     pn = node.parentNode; 
     if(pn.className == "searchword") { 
      prevSib = pn.previousSibling; 
      nextSib = pn.nextSibling; 
      nextSib.nodeValue = prevSib.nodeValue + node.nodeValue + nextSib.nodeValue; 
      prevSib.nodeValue = ''; 
      node.nodeValue = ''; 
     } 
    } 
} 

function localSearchHighlight(searchStr,doc) { 
    doc = typeof(doc) != 'undefined' ? doc : document; 
    if (!doc.createElement) return; 
     if (searchStr == '') return; 
    // Trim leading and trailing spaces after unescaping 
    searchstr = unescape(searchStr).replace(/^\s+|\s+$/g, ""); 
    if(searchStr == '') return; 
    phrases = searchStr.replace(/\+/g,' ').split(/\"/); 
    // Use this next line if you would like to force the script to always 
    // search for phrases. See below as well!!! 
    //phrases = new Array(); phrases[0] = ''; phrases[1] = searchStr.replace(/\+/g,' '); 
    for(p=0;p<phrases.length;p++) { 
      phrases[p] = unescape(phrases[p]).replace(/^\s+|\s+$/g, ""); 
     if(phrases[p] == '') continue; 
     if(p % 2 == 0) words = phrases[p].replace(/([+,()]|%(29|28)|\W+(AND|OR)\W+)/g,' ').split(/\s+/); 
     else { words=Array(1); words[0] = phrases[p]; } 
       for (w=0;w<words.length;w++) { 
      if(words[w] == '') continue; 
      highlightWord(doc.getElementsByTagName("body")[0],words[w],doc); 
      } 
    } 
} 

</script> 

2)调用函数

<script language="javascript"> 
window.onload=localSearchHighlight('search search'); 
</script> 

Source

+1

感谢哥们,但我希望它成为一个PHP代码。但无论如何我会稍后使用它,这也是我投票的原因! – 2011-04-22 18:18:21

+0

不客气。 – 2011-04-22 18:58:51

相关问题