如何在段落中查找并添加粗体字符串?

时间:2011-04-22 15:28:27

标签: php html search replace

我正在为我的网站创建搜索脚本。但我想在每个搜索结果的描述中italic匹配的单词。我正在使用的脚本位于PHP,而描述段落的变量为$search_desc。目前我正在使用str_ireplace()功能来实现我的目标。 但我认为我的目标太遥远了!这是函数

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

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

  

这是搜索演示的说明。

italic属性添加到显示的匹配单词

之后的说明
  

这是搜索演示的说明。

所以你可以看到问题很严重。因为原始描述被编辑!所以任何人都对我的问题有任何想法?如果你确实告诉我了,请告诉我!

2 个答案:

答案 0 :(得分:8)

我认为你想要使用的是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 :(得分: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