Foros del Web » Programando para Internet » PHP »

Expresiones regulares

Estas en el tema de Expresiones regulares en el foro de PHP en Foros del Web. Buenas, a ver si me podeis echar una manita. Las expresiones regulares en un eregi_replace me está dando un dolor de cabeza terrible. Supongamos que ...
  #1 (permalink)  
Antiguo 04/07/2004, 18:39
Avatar de Trebol-a  
Fecha de Ingreso: enero-2003
Ubicación: Cartagena, España
Mensajes: 44
Antigüedad: 14 años, 11 meses
Puntos: 0
Expresiones regulares

Buenas,
a ver si me podeis echar una manita. Las expresiones regulares en un eregi_replace me está dando un dolor de cabeza terrible.

Supongamos que tengo el siguiente parrafo producto de una consulta a bd:

Código:
primer <b>txt</b> en negrita, 
<img src="http://www.google.com/txt.jpg">
segundo txt
<a href="http://www.google.com/txt.jpg">enlace</a>
tercer txt
Supongo que os imaginais por donde voy. ¿que expresion regular tendría que usar para subrayar TXT en ese parrafo sin fastidiar el SRC de la imagen ó el href del enlace?
Si uso:
Código PHP:
eregi_replace("txt""<span>txt</span>"$parrafo); 
me fastidian SRC y HREF

y si contruyo una expresion que ignore lo rodeado por comillas (por ejemplo) no me subrayaría el segundo TXT del parrafo (está entre comillas)
Espero que se me entienda....
gracias anticipadas.
  #2 (permalink)  
Antiguo 04/07/2004, 19:13
 
Fecha de Ingreso: julio-2004
Ubicación: Uruguay
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
No, no te entiendo muy bien, el parrafo ese que mostras, esta en un solo campo de una tabla?
o son varios campos?

no, definitivamente no te entiendo...

pbaldovi
  #3 (permalink)  
Antiguo 04/07/2004, 19:24
Avatar de Trebol-a  
Fecha de Ingreso: enero-2003
Ubicación: Cartagena, España
Mensajes: 44
Antigüedad: 14 años, 11 meses
Puntos: 0
Bueno, el parrafo es lo de menos (es un ejemplo).
Lo que quería es:
reemplazar con eregi_replace en un parrafo de texto determinadas palabras, pero solo en el caso de que dichas palabras no formen parte de un SRC o HREF.

Tengo esto:

"Esto es un parrafo de texto con la palabra DOLOR escrita varias veces. Aqui una imagen <img src="http://www/dolor.jpg"> y aqui otra vez: DOLOR, y aqui otra vez <a href="//www/www/dolor.html">"


Quiero conseguir esto:

"Esto es un parrafo de texto con la palabra <span>DOLOR</span> escrita varias veces. Aqui una imagen <img src="http://www/dolor.jpg"> y aqui otra vez: <span>DOLOR</span>, y aqui otra vez <a href="//www/www/dolor.html">"


Pero NO esto:

"Esto es un parrafo de texto con la palabra <span>DOLOR</span> escrita varias veces. Aqui una imagen <img src="http://www/<span>dolor</span>.jpg"> y aqui otra vez: <span>DOLOR</span>, y aqui otra vez <a href="//www/www/<span>dolor</span>.html">"



Mejor ahora?
  #4 (permalink)  
Antiguo 04/07/2004, 19:30
 
Fecha de Ingreso: julio-2004
Ubicación: Uruguay
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Ahora si te entiendo.
lo que se me ocurre es te quedes con una cadena que solo contenga texto.
es decir, eliminar todos los tags de HTML. Habría que hacer código para ver que sale, pero se me ocurre, ir borrando de la cadena todas las etiquetas. Buscar "<" que indican el comienzo y borrar hasta ">" que indican el final.... no se, habría que probarlo.

Dejame un rato. Voy a probar algo.

saludos.
  #5 (permalink)  
Antiguo 04/07/2004, 21:13
 
Fecha de Ingreso: septiembre-2003
Ubicación: Pirexia
Mensajes: 150
Antigüedad: 14 años, 3 meses
Puntos: 1
A ver, no se mucho de expresiones regulares, pero voy a tratar de plantearte una solucion usando otros métodos...

Código PHP:
<?

// Aquí tenemos la cadena a modificar:

$cadena "primer txt en negrita, 
<img src=\"http://www.google.com/txt.jpg\">
segundo txt
<a href=\"http://www.google.com/txt.jpg\">enlace</a>
tercer txt"
;

// Ahora hacemos un explode de la siguiente manera:

$partes explode(' txt'$cadena);

// De esta forma separamos la cadena en los trozos dividos
// por ' txt', nótese que al principio tiene un espacio para
// asegurarnos de que lo que agarre sea una palabra y no
// esté incluido dentro de ningún tipo de link.

// Ahora hacemos un implode así:

$nueva_cadena implode(' <span>txt</span>'$partes);

echo 
$nueva_cadena

?>
Bueno, es medio rudimentaria, pero puede servirte, claro, tiene varias "vulnerabilidades", por decirlo asi, por ejemplo que haya una palabra que sea: "txtarea-etc..." esto te dará como resultado: "<span>txt</span>area-etc..."

O que por ejemplo, la palabra txt sea la primera de la cadena, entonces no la agarrará el script, porque como dije antes, se coloca un espacio antes para asegurarse que no sea ningún tipo de link, y al ser la primera palabra, no tiene espacio antes...
__________________
In a world without walls, who needs Windows?
  #6 (permalink)  
Antiguo 04/07/2004, 21:51
 
Fecha de Ingreso: julio-2004
Ubicación: Uruguay
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Bueno, Trebol-a
creo que ahora si quedó.

Suerte. Mandame comentarios, please.

Código PHP:
<?


$html 
"<b>texto en negrita</b><a href=negrita.html>negrita clic aqui</a>";

echo 
remplazar_ingorar_htmltags("<b>texto en negrita</b><a href=negrita.html>negrita clic aqui</a>","negrita","azulcita");




function 
remplazar_ingorar_htmltags($texto,$cambiar,$cambiarpor){

preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/"$texto$coincidencias);
for (
$i=0$icount($coincidencias[0]); $i++) {
  
$coincidencias[3][$i] = eregi_replace "$cambiar"$cambiarpor$coincidencias[3][$i]);
  
$cadena$cadena $coincidencias[1][$i] . $coincidencias[3][$i] . $coincidencias[4][$i];
}

return (
$cadena);

}

?>
  #7 (permalink)  
Antiguo 04/07/2004, 22:09
Avatar de Trebol-a  
Fecha de Ingreso: enero-2003
Ubicación: Cartagena, España
Mensajes: 44
Antigüedad: 14 años, 11 meses
Puntos: 0
bue... es una opcion que ya había pensado, pero poco efectiva puesto que lo que desconozco la cadena que se vá a buscar, y perfectamente puede ser un principio de linea, ir a continuacion de una coma (sin espacio), etc...
Idem con la solución que dá pbaldovi: Si quito todo el contenido entre < y >, reemplazo ..... y reconstruyo... pero ¿donde iban los < > que quité anteriormente....
Es casi obligado el uso de expresiones regulares,
Resumiendo:

Digamos que la expresión regular debería encontrar TEXTO aqui:
<p class="especial">texto</p>

Pero no aqui:
<p class="texto">blbablablabla</p>

Esto es lo que estoy usando.... pero claro, falla:
Código:
$corregido = eregi_replace("([^<].*)(".$termino.")([^>].*)", "\\1<span style='background-color:#FFFF55;'>\\2</span>\\3", $cadena);
Esto falla, porque basta con que por delante lleve un <b> para que no lo encuentre.
  #8 (permalink)  
Antiguo 04/07/2004, 22:11
Avatar de Trebol-a  
Fecha de Ingreso: enero-2003
Ubicación: Cartagena, España
Mensajes: 44
Antigüedad: 14 años, 11 meses
Puntos: 0
:D hemos escrito al mismo tiempo.... voy a probarlo y te cuento... Gracias !
  #9 (permalink)  
Antiguo 04/07/2004, 22:16
 
Fecha de Ingreso: julio-2004
Ubicación: Uruguay
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Naa. estuve probando cosas y no funciona muy bien.
de todas maneras es un buen comienzo, me parece.

paul
  #10 (permalink)  
Antiguo 04/07/2004, 23:08
 
Fecha de Ingreso: julio-2004
Ubicación: Uruguay
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Desacuerdo

Naa. estuve probando cosas y no funciona muy bien.
de todas maneras es un buen comienzo, me parece.

paul
  #11 (permalink)  
Antiguo 05/07/2004, 00:40
Avatar de Trebol-a  
Fecha de Ingreso: enero-2003
Ubicación: Cartagena, España
Mensajes: 44
Antigüedad: 14 años, 11 meses
Puntos: 0
, no me funciona....

mira, casi que lo tengo:

esto:
Código:
$corregido = eregi_replace("([^(<.*\".*)][.]*)(".$termino.")([^(.*\".*>)][.]*)","\\1<span style='background-color:#FFFF55;'>\\2</span>\\3", $cadena);
me convierte esto:
Código:
Este es una muela.<br>Aqui una <img border='1' src='muela.gif'><br>otra muela<br>aqui otra de la <s>muela</s>
en esto:
Código:
Este es una muela.<br>Aqui una <img border='1' src='muela.gif'><br>otra <span style='background-color:#FFFF55;'>muela</span><br>aqui otra de la <s><span style='background-color:#FFFF55;'>muela</span></s>
pero me sigue fallando en la primera "muela".
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:59.