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. Hola, Me estoy volviendo loco con el tema de las expresiones regulares. Las necesito para hacer una cosa muy sencilla pero no hay manera. A ...
  #1 (permalink)  
Antiguo 12/08/2008, 11:52
 
Fecha de Ingreso: agosto-2008
Mensajes: 4
Antigüedad: 15 años, 8 meses
Puntos: 0
Pregunta Expresiones regulares

Hola,

Me estoy volviendo loco con el tema de las expresiones regulares. Las necesito para hacer una cosa muy sencilla pero no hay manera. A ver si alguien me puede ayudar:

Tengo esta cadena:
$cad = "palabra1 <elimina> frase a eliminar </elimina> palabra2 <elimina> frase a eliminar </elimina> palabra3";

El resultado que quiero es:
palabra1 palabra2 palabra3
de manera que quiero eliminar lo que hay entre las etiquetas <elimina> y </elimina>

El código (dentro de mi lógica) que debería hacer esto es:
$cad = eregi_replace("<elimina>.*<\/elimina>", "",$cad);

El caso es que me devuelve:
palabra1 palabra3
(¡quiero la palabra2 también!)

Lo he probado de todas las maneras, estudiando tutoriales de expresiones regulares y no hay manera... ¿Alguna ayuda por favor?

Gracias
  #2 (permalink)  
Antiguo 12/08/2008, 12:47
Avatar de Mort20  
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Expresiones regulares

Te aconsejo este tutorial de expresiones regulares:
http://bulma.net/body.phtml?nIdNoticia=770

El problema es que con (.*) incluyes cualquier cosa según he ido experimentando, a diferencia de Apache que sólo incluye caracteres alfanuméricos, incluidos espacios y </elimina>, esto colisiona con tu frase y salen resultados inesperados. Ahí va mi solución:

Código PHP:
<?php
  $cad 
eregi_replace("<elimina>([0-9a-zA-Z' ']*)<\/elimina>""",$cad);
?>
__________________
Un Lannister siempre cumple sus promesas
  #3 (permalink)  
Antiguo 12/08/2008, 13:14
 
Fecha de Ingreso: agosto-2008
Mensajes: 4
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Expresiones regulares

Mort20, muchas gracias por tu respuesta!

Lo he probado y funciona bien con el ejemplo que he puesto. Pero a la hora de la practica no me sirve porque entre <elimina> y </elimina> hay signos de puntuación, corchetes y demás carácteres.

Estoy mirándome el manual que me has recomendado a ver si encuentro la solución.

Gracias!
  #4 (permalink)  
Antiguo 12/08/2008, 13:35
Avatar de Mort20  
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Expresiones regulares

Para eso sólo tienes que agregar estos símbolos entre los corchetes, escapandolos adecuadamente. Aunque vigila, si permites "<",">" y "/" a la vez, volverás a estar en las mismas ya que </elimina> entrará dentro del conjunto de caracteres posibles.
__________________
Un Lannister siempre cumple sus promesas
  #5 (permalink)  
Antiguo 12/08/2008, 13:45
 
Fecha de Ingreso: agosto-2008
Mensajes: 4
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Expresiones regulares

Lo estaba haciendo ahora:
$cad = eregi_replace("<script>([0-9a-zA-Z' ','¿!¡;:\.\?\{\}=\(\)\{\}\-\+\*\.\^\$\?\|\\\/]*)<\/script>", "",$cad);

Pero esto una barbaridad. Además, me acabo de dar cuenta que a la que hay un acento en la frase a eliminar ya no lo coge bien.

¿No hay alguna otra solución?
  #6 (permalink)  
Antiguo 12/08/2008, 17:23
Avatar de julianmejio  
Fecha de Ingreso: agosto-2005
Ubicación: Medellín, Antioquia
Mensajes: 88
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Expresiones regulares

Cita:
Iniciado por tabueno Ver Mensaje
Lo estaba haciendo ahora:
$cad = eregi_replace("<script>([0-9a-zA-Z' ','¿!¡;:\.\?\{\}=\(\)\{\}\-\+\*\.\^\$\?\|\\\/]*)<\/script>", "",$cad);

Pero esto una barbaridad. Además, me acabo de dar cuenta que a la que hay un acento en la frase a eliminar ya no lo coge bien.

¿No hay alguna otra solución?
¿No quedaría más fácil decir que cualquier caracter dentro de <elimina /> se elimine?, igual, todo lo que esté encerrado dentro de estas etiquetas no se va a ver , podrías hacer esto:

Código PHP:
$cad eregi_replace("<elimina>(.*)<\/elimina>""",$cad); 
  #7 (permalink)  
Antiguo 13/08/2008, 02:10
 
Fecha de Ingreso: agosto-2008
Mensajes: 4
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Expresiones regulares

Hola julianmejio,

Si, eso sería lo ideal y lo que había hecho al principio, pero si lees mi primer mensaje verás que no me funciona. Me devuelve: palabra1 palabra3 y necesito también la palabra2.

Gracias
  #8 (permalink)  
Antiguo 13/08/2008, 09:20
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Expresiones regulares

Hola tabueno,

Tenés 2 formas de hacer esto:
- Si sabés que la cadena nunca contendrá un "<", podés usar un patrón como este:

<elimina>([^<]*)</elimina>

Que quiere decir "coincido con cualquier secuencia de caracteres que NO contenga un <". La idea es que la coincidencia termine en cuanto encuentre un <, que es el comienzo de la etiqueta de cierre.

- Si no podés asegurar que la cadena no contendrá un <, la solución es pedirle al patrón que coincida con el menor conjunto de caracteres posible. Esto se logra poniendo un ? junto al cuantificador:

Código PHP:
$cad eregi_replace("<elimina>.*?</elimina>""",$cad); 
(quito el \/ porque únicamente agrega confusión, es inútil para las expresiones regulares POSIX (sí se vuelve necesario en algunos casos con expresiones regulares compatibles con Perl)

El motivo por el que tu patrón original no funciona es que por defecto el patrón "intenta" coincidir con la mayor cadena posible, que en tu ejemplo sería:

palabra1 <elimina> frase a eliminar </elimina> palabra2 <elimina> frase a eliminar </elimina> palabra3


Saludos.
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 00:21.