2011-04-22 12 views
5

He estado creando un Script de búsqueda para mi sitio. Pero quiero italic las palabras coincidentes en la Descripción de cada resultado de búsqueda. La secuencia de comandos que estoy usando está en PHP y el párrafo Descripción tiene la variable $search_desc. Actualmente estoy usando la función str_ireplace() para lograr mi objetivo. Pero creo que mi objetivo está muy lejos! Aquí está la función¿Cómo encontrar y agregar una cadena en negrita en un párrafo?

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

Pero el problema es que si la consulta de búsqueda se search y por el ejemplo de la descripción de un resultado de búsqueda es,

Esta es la descripción de búsqueda de demostración.

lo que la descripción después de añadir italic alojamiento a la palabra que concordaba se muestra

Esta es la descripción para la búsqueda de demostración.

Para que pueda ver el problema es grande. ¡Porque la descripción original se edita! Entonces, ¿alguien tiene alguna idea para mi problema? Por favor, si me lo dices!

+0

Para resaltar los resultados de búsqueda en una forma compatible con HTML, una pregunta relacionada es: [Ignorar etiquetas html en preg_replace] (http://stackoverflow.com/q/8193327/367456) – hakre

Respuesta

7

Creo que lo que desea utilizar es preg_replace.

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

Esta función le permite buscar y reemplazar mediante un token de la palabra que se encuentra. Algo como esto podría funcionar:

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

Este código podría tener errores, simplemente lo armé rápidamente. Pero creo que esta es la idea correcta para tu situación.

+1

Gracias amigo! ¡Esto funcionó para mí tal como lo pensé! –

+0

Es una buena solución. Solo tiene errores cuando se usan barras diagonales. – Apalabrados

2

Creo que puede lograr su objetivo fácilmente mediante javascript. Prueba esto:

1) Incluir el siguiente código:

<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) llama a la función

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

Source

+1

Gracias amigo, pero quiero que sea un código PHP Pero de todos modos lo usaré más tarde, ¡por eso también lo estoy votando! –

+0

De nada. –

Cuestiones relacionadas