How to find and add a bold line in a paragraph?

I am creating Search Script for my site. But I want italicmatching words in the description of each search result. The Script used is located in PHP, and the description paragraph has a variable $search_desc. I am currently using the function str_ireplace()to achieve my goal. But I think my goal is too far ! Here is the function

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

But the problem is that if the search query search, and for example, a description of the search result,

This is a description for the search.

So, the description after adding the property italicto the matching word that it shows

This is the description for the Demo search.

So you see that the problem is big. Because the original description is being edited! So does anyone have any ideas for my problem? Please let me know!

+5
source share
2 answers

I think you want to use preg_replace.

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

This function allows you to search and replace with a token for a found word. Maybe something like this:

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

This code may have errors, I just quickly threw them away. But I think this is the right idea for your situation.

+7
source

I think you can easily achieve your goal using javascript. Try the following:

1) Include the following code:

<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) Call a function

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

Source

+2

All Articles