Foros del Web » Programando para Internet » PHP »

Marcar palabras

Estas en el tema de Marcar palabras en el foro de PHP en Foros del Web. Hola: Estaba buscando algo que me ayudara a marcar un texto de búsqueda, sea una única palabra o una cadena de varias. Y con este ...
  #1 (permalink)  
Antiguo 01/05/2011, 20:43
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Marcar palabras

Hola:

Estaba buscando algo que me ayudara a marcar un texto de búsqueda, sea una única palabra o una cadena de varias. Y con este código lo consigo casi en todas las posibilidades que se me ocurren.

Es decir, si se busca "para", marcará cosas como el propio vocablo "para", que empiecen por "para" como "paracaidas", que terminen por "para" como "compara", pero no que la contenga, es decir, algo como "preparado" no se marcaría.

Y esto es lo que me gustaría marcar igualmente. Luego, ¿cómo se debería modificar el segundo parámetro del array_push($patron, ...) para añadir esta opción de marcado?
Esto ¿implicaría modificar también la línea de $array_push($reemplazo,...)?

Ya que estamos, me gustaría saber si alguien me pudiera explicar detalladamente lo que significa el trozo de código:

"/\b($array_cadena[$i])+\b|\b([des|il|in|im|ir|un|non]+)\B($array_cadena[$i]+\b)|\b($array_cadena[$i]+)\B([ed|er|ing|s|es|ful|less|dom|ship|ness|hood|ty|ance |ment|ly|ally|fuly|est|]+\b)/i"

Concretamente:
- Se trata de un patrón de búsqueda para buscar la cadena deseada de 3 maneras diferentes, cada una de ellas separada por el carácter de | que es como un OR?
- ¿Por qué empieza por /?
- ¿qué es \b al principio o al final o tras el + o dentro de los () tras el +?
- ¿es lo mismo \b que \B?
- ¿qué es /i?
- Por ejemplo, del trozo a explicar, esto que sigue \b([des|il|in|im|ir|un|non]+)\B($array_cadena[$i]+\b) ¿es para encontrar resultados de palabra que empiecen por des o il o in o ... nom y sigan por la variable $array_cadena[$i] ?
Luego si pongo así:
\b([a-z]+)\B($array_cadena[$i]+\b)
buscará todo lo que empiece por cualquier prefijo más la variable recorrida, ¿no?
Y si pongo así:
\b($array_cadena[$i]+)\B([a-z]+\b)
buscaría todo lo que empiece la variable recorrida más cualquier sufijo, ¿no?

Entonces lo siguiente, ¿valdría para buscar algo que empezara por cualquier cosa seguido de la variable recorrido más cualquier cosa?:
\b([a-z]+)\B($array_cadena[$i]+)\B([a-z]+\b)
Y sino, ¿cómo sería?

Igualmente, ¿a que se refiere o a que llama cada uno de los $1 $2 $3 ... que están dentro de ?

array_push($reemplazo, "<subC$i>$1$2$3$4$5</subC$i>");

Para terminar, tampoco entendí a que se refería Hidek 1 cuando en su respuesta decía que
Cita:
al patron agregale una s final despues de la i
. ¿Para qué valdría esa s?, ¿habría que poner /i/s o que?

Espero encarecidamente las respuestas a todo lo expuesto. Gracias.
__________________
Saludos,

zacktagnan.
=================================================

Última edición por zacktagnan; 02/05/2011 a las 04:54
  #2 (permalink)  
Antiguo 02/05/2011, 05:59
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Respuesta: Marcar palabras de una cadena

Espero que alguien me responda si no es mucha molestia a todas las dudas expuestas en el anterior mensaje.

Sobre todo a como modificar el segundo parámetro del siguiente array_push para que como resultado final, teniendo en la cadena la palabra "marcar" me marque toda coincidencia, es decir, tanto estando como palabra independiente, o al inicio de o al final o dentro de otra palabra y sin tener en cuenta que esté en mayúsculas o minúsculas. O sea:

que marque si encuentra palabras en la cadena pasada como marcar, comarca, desMARCAR, marcarlas o desMarcarlas. Todas de una forma o de otra tienen o contienen "marcar" y deberían remarcarse con el formato deseado.

Código PHP:
array_push($patron"/\b($array_cadena[$i])+\b|\b([des|il|in|im|ir|un|non]+)\B($array_cadena[$i]+\b)|\b($array_cadena[$i]+)\B([ed|er|ing|s|es|ful|less|dom|ship|ness|hood|ty|ance|ment|ly|ally|fuly|est|]+\b)/i"); 
El código tal y como lo dejo Adler, formatea si lo que se busca es una palabra en sí, o si está al inicio o al final pero NO si está dentro de otra palabra.

Porfa, ¿como sería el cambio a aplicar?


PD:
Esto ha sido separado de otro POST que por su falta de actividad, ya no admite responder en él y por eso con mis respuestas se ha creado un nuevo tema, aparte que directamente si se accede a él, el sistema se redirige directamente a este.

En el post mencionado, se daba el siguiente código que es en el que yo me baso para plantear mis dudas:

Código PHP:
<style type="text/css">
<!--
.texto {
   background-color: #F0F0F0;
   font-family:Verdana;
   color: navy;
   font-size: 10px;
   text-align:left;
}
td subC0
{
    background-color: #C0FF3E;
}
td subC1
{
    background-color: #FFFF00;
}
td subC2
{
    background-color: #00FFFF;
}
td subC3
{
    background-color: #7FFFD4;
}
td subC4
{
    background-color: #FFC0CB;
}
td subC5
{
    background-color: #FFBBFF;
}
td subC6
{
    background-color: #FFD700;
}
td subC7
{
    background-color: #BBFFFF;
}
td subC8
{
    background-color: #FF7F00;
}
td subC9
{
    background-color: #FFE4C4;
}
-->
</style>

...

<?

    $patron 
= Array();
    
$reemplazo = Array();
    
//$cad = stripslashes($_GET["t"]);
    //$cad = strip_tags($cad);
    
$cad "marcar-palabras";
    
$array_cadena  explode("-",$cad);
    
$strOriginal "Esto es un ejemplo para desMARCAR las palabras? que quiero marcar, acorde a las 'palabras' que ....";
    for (
$i=0$i<sizeof($array_cadena); $i++){
     
    
array_push($patron"/\b($array_cadena[$i])+\b|\b([des|il|in|im|ir|un|non]+)\B($array_cadena[$i]+\b)|\b($array_cadena[$i]+)\B([ed|er|ing|s|es|ful|less|dom|ship|ness|hood|ty|ance|ment|ly|ally|fuly|est|]+\b)/i");
    
array_push($reemplazo"<subC$i>$1$2$3$4$5</subC$i>");  
    }
    
ksort($patron);
    
ksort($reemplazo);
    echo 
preg_replace($patron$reemplazo$strOriginal);
?>
__________________
Saludos,

zacktagnan.
=================================================

Última edición por zacktagnan; 02/05/2011 a las 12:33
  #3 (permalink)  
Antiguo 02/05/2011, 13:23
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Respuesta: Marcar palabras

Bueno, buscando un poco más y usando un editor /testeador de Regex online, haciendo prueba/error, me ha salido que con el siguiente trozo:

Código PHP:
|b([0-9a-zA-Z]+)B($array_cadena[$i]+)B([0-9a-zA-Z]+b
se resaltaría toda cadena contenida en otra, es decir, si seguimos con el ejemplo de buscar "marca", ya se resaltarían también palabras que la contienen sin que esté al inicio o al final, es decir, en casos como "comarcas", desmarcadas

Por tanto el patrón ahora quedaría:

Código PHP:
array_push($patron"/\b($array_cadena[$i])+\b|\b([des|il|in|im|ir|un|non]+)\B($array_cadena[$i]+\b)|\b($array_cadena[$i]+)\B([ed|er|ing|s|es|ful|less|dom|ship|ness|hood|ty|ance|ment|ly|ally|fuly|est|]+\b)|\b([0-9a-zA-Z]+)\B($array_cadena[$i]+)\B([0-9a-zA-Z]+\b)/i"); 

No obstante, ahora se me plantea otro problema: ¿cómo excluir algo del patrón? Según parece el carácter negador de las expresiones regulares el ^. Pero no llego aplicarlo para que me dé el resultado deseado.

Volvamos al planteamiento

Yo tengo un texto dónde busco cierta cadena (de una o más palabras o letras sueltas)
Toda coincidencia la voy a resaltar con una etiqueta de estilo que se podría llamar <remarcarTxt>...</remarcarTxt>

Si el texto es:
"la marca de la clase desmaRCA o marcadas y mas MARCAdas o desmarcadas o coMARcAles"

Y la cadena a buscar es:
"marca-de-y-a"

En el texto, se resaltaran coincidencias como marca, de, ... desmaRCA.

Pero llega un momento en el que también se me formateara el propio nombre de la etiqueta usada para dar el estilo para destacar la palabra buscada, rompiendo así dicha etiqueta.

Entonces, ¿cómo hace para que el patrón deje de buscar en todo bloque que sea?:
<remarcarTxt>cualquier_contenido_formateado</remarcarTxt>

A ver si alguien me da una idea para conseguirlo.
__________________
Saludos,

zacktagnan.
=================================================
  #4 (permalink)  
Antiguo 02/05/2011, 15:10
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 8 meses
Puntos: 202
Respuesta: Marcar palabras

A ver, no leí del todo esos pedazos de explicaciones.
Vamos que leí 3 líneas y fue ya mucho.

-La idea más simple es la correcta. No sé ni para que usas array, cuando podrías hacer los tipos de búsqueda y señalando cada caso con expresiones regulares.

Por ejemplo, marcar con negrita todas las palabras que contengan "para" no ocupa tanto código ¿No?

Código PHP:
<?php
echo preg_replace("/para/""<b>para</b>""para paracaidas compara");
?>
Como verás, lo que hay que hacer es:
-Usar la función/es que pueda/n ayudarte.
-Si no se saben buscarlas.
-No complicarse así la vida. No es sano
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #5 (permalink)  
Antiguo 02/05/2011, 17:52
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Respuesta: Marcar palabras

Lo siento si te aburre tanto texto junto.

Si lo que quiero que se busque fuese solamente una palabra y se formatee esta si se encuentra de un texto dado, ya lo tendría hecho.

Pero en el buscador, el usuario podría poner no solamente "para tal"

Entonces en el texto o frase o párrafo, por ejemplo

"para paracaidas comparados para tal cosa y taladros"

quiero que se formatee no solo "para tal" estando junto sino también cada palabra de la cadena de búsqueda, entonces:

Código HTML:
Ver original
  1. <b>para</b> <b>paracaidas</b> <b>comparados</b> <b>para tal</b> cosa y <b>taladros</b>

El problema final planteado que no he solucionado es que por un casual el usuario pusiera para buscar algo como "para tal b"

Al formatear el trozo de la "b", formatearía las etiquetas <b> rompiéndolas y saliendo defectuosamente o solo los < y >.

Y eso es lo que quiero evitar y no sé.
__________________
Saludos,

zacktagnan.
=================================================
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:05.