2010-12-14 16 views
5

Así que estoy haciendo una función de búsqueda para comentarios. Alguien más aquí me ayudó con el SQL query. Lo que también quiero hacer es resaltar el texto de la consulta de búsqueda en los resultados.PHP - resaltar el texto de una cadena que contenga HTML

Los resultados se almacenan como HTML dentro de un $variable. ¿Cómo puedo envolver el texto de la consulta de búsqueda dentro de una etiqueta <span> por ejemplo, sin estropear el html?

por ej. la consulta de búsqueda puede ser foo bar y la salida puede verse como:

<p>bla bla foo bar bla</p> 

por lo que debe ser algo como:

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

Respuesta

2

creo que esto es más complicado de lo que parece. Si estamos buscando foo bar continuación

<p>bla bla foo bar bla</p> 

se convertirán en

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

pero ¿qué hay algunos casos especiales? Podría ser que foo bar se corresponde dentro de una etiqueta HTML:

<p>bla bla <span class="foo bar">foo bar</span> bla</p> 

que será sustituido como

<p>bla <span class="<span class="highlight">foo bar</span>">foo bar</span> bla bla</p> 

Estoy en lo cierto con esto? No he estado en este tema, pero recomendaría que compruebe en los documentos de CakePHP (sí, sé que no está utilizando el framework--) en el Ayudante de texto, el método highlight() que maneja las etiquetas HTML correctamente. Echa un vistazo a la fuente, pruébala y, si te funciona, adelante y cópiala.

+1

sí, esas situaciones pueden ocurrir. Debería haber mencionado eso en la pregunta. De todos modos, encontré una solución más fácil, ¡utilizando jQuery! :RE – Alex

1
$searchString = 'foo bar'; 
$searchResult = '<p>bla bla foo bar bla</p>'; 

var_dump(str_replace($searchString, '<span>'.$searchString.'</span>', $searchResult)); 

var_dump(preg_replace('/'.$searchString.'/', '<span>'.$searchString.'</span>', $searchResult)); 
1

Si se asegura de que el término de búsqueda en sí no contiene ningún HTML, puede seguir adelante y envolverlo en "<span>" con la ayuda de str_replace().

Tenga en cuenta que esta es una de las pocas ocasiones en que tratar con HTML a través de las funciones de cadena no es malo per se.

Si el término de búsqueda puede contener HTML (es decir, el resaltado puede abarcar los bordes de las etiquetas), las cosas se vuelven mucho más complicadas y no se saldrá con un atajo inteligente como el de arriba.

+1

bien, hay otro problema. por ej. la salida puede tener '', luego el marcado se rompe .. – Alex

+0

@Alex: Esto es cierto, y es exactamente la razón por la cual el uso de la manipulación de cadenas básica generalmente se considera un no-no para trabajar con HTML. Depende mucho de sus datos si este enfoque simplista es viable o no. Si el comentario puede contener * cualquier * HTML, se encuentra en el rincón "mucho más complicado" muy rápido. – Tomalak

7

simple buscar y reemplazar:

$resultHTML = str_replace($searchString, '<span class="highlight">'.$searchString.'</span>', $resultHTML); 
+1

http://php.net/manual/en/function.str-replace.php –

+4

No olvide que hay una versión insensible a mayúsculas/minúsculas también ... str_ireplace – jocull

+0

buena ... he encontrado –

2
<?php 

$result = "<p>Bla bla foo bar bla bla test x x x</p>"; 

$query = "foo bar"; 

// The important point here is, USE single quote (') in replacement part!! 
echo preg_replace("/($query)/", '<span class="highlight">${1}</span>', $result); 
+1

Puede usar double citas también, solo tengo que escapar de ellos. Para obtener más información, http://en.wikipedia.org/wiki/Escape_character – jolt

+0

gracias ... esto funciona como encanto para mí ... –

1

que tenían la misma pregunta, pero me pareció this

El código está diseñado para cambiar aleatoriamente los colores claros, pero esto se hace a través de una función, por lo que es fácil de modificar para utilizar uno de los colores:

 $color = '#FCB514'; //self::generate_colors(); 

Primer mensaje!

0

text-shadow: 1px 1px 1px # FCD600;

Cuestiones relacionadas