Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: ‭lipman en 27 Junio 2011, 11:16 am



Título: Usando expresiones regulares cuando hay saltos de línea
Publicado por: ‭lipman en 27 Junio 2011, 11:16 am
Wenas, estoy tratando de usar el preg_match_all y las expresiones regulares para poder buscar textos dentro de documentos html.

Si quisiera por ejemplo el interior del body de un html, lo que en principio se me ocurriría de hacer sería un:

preg_match_all('/(<body>)(.*)(<\/body>)/',$data,$resultado);

El problema es que cuando hay saltos de línea de por medio, esto no funciona.

A alguien se le ocurre algo que pudiera hacer? quizás borrar los saltos de línea? Como haría esto?

Un saludo y gracias!


Título: Re: Usando expresiones regulares cuando hay saltos de línea
Publicado por: Darkgold9 en 27 Junio 2011, 12:07 pm
Wenas, he estudiado ese tema este año en la uni aunq no exactamente con lo que tu intentas, pero el error es que el operador comodin (el "." que pones ai) acepta cualquier caracter excepto el salto de linea, creo que una posible solucion seria que pusieses en un conjunto que aceptas el comodin y el salto de linea, algo asi he estudiado yo: [.\n]*, o tmb aunq esta nose si te valdria al 100%, puedes poner q aceptas todo menos entrecomillados o algun caracter que no kieras, ej: [^\"].


Título: Re: Usando expresiones regulares cuando hay saltos de línea
Publicado por: ‭lipman en 27 Junio 2011, 13:01 pm
Exacto.

Al final lo solucioné casi como me dijiste, de la siguiente forma

((.*)\n*)

Ya que sino, solo podia tomar un caracter + salto de línea

Un saludo!


Título: Duda con expresiones regulares
Publicado por: ‭lipman en 27 Junio 2011, 14:04 pm
He vuelto a tener una duda existencial con las expresiones regulares, a ver si alguno sabe como solucionarlo. Cuando buscamos algo con expresiones regulares, no es sucesivo y va de izquierda a derecha, me explico:

Imaginemos que tengo la cadena <b>Hola <i>Mundo</i></b>

Si hiciera un preg_match_all, poniendo de patron algo como:

\<(.*)\>

Me cogería toda la cadena, ya que el sistema entiende:

<b>Hola <i>Mundo</i></b>

Sin embargo, mi pregunta es, si esto se puede cambiar, para que buscase y diese de resultado:

<b>

No se si me explico.. Esta duda existencial me viene a raiz de que quiero obtener la ruta de todas las imágenes de una página web. El contenido de esta página web lo tengo en una variable, entonces hago:

Código:
preg_match_all("/\<img(.*)src=(\"|')(.*(\.(jpg|png|gif)))(\"|')/",$valor,$asd);

En principio parece que funciona bien, pero si se encuentra con esto por ejemplo, no funciona bien:

Código:
<img src="http://imagen.png" width="320" /></a></div><a href="http://imagen.png">

Ya que me devuelve: http://imagen.png" width="320" /></a></div><a href="http://imagen.png, en lugar de http://imagen.png

Alguna solución? (tengo que hacerlo con expresiones regulares, no me valdria hacer explodes ni nada por el estilo)

Un saludo!


Título: Re: Usando expresiones regulares cuando hay saltos de línea
Publicado por: ~ Yoya ~ en 27 Junio 2011, 16:02 pm
Mira esta que acabo de crear, es un poco avanzada!.

Código:
<img.+src=(?:\"|\')(?i)([^"']+)(?<=png|jpg|gif)(?-i)

Prueba la y cuenta.


Título: Re: Usando expresiones regulares cuando hay saltos de línea
Publicado por: raul338 en 27 Junio 2011, 17:22 pm
Regular Expressions - Repetition with Star and Plus (http://www.regular-expressions.info/repeat.html) mira la parte de "Watch Out for The Greediness!"

:)


Título: Re: Usando expresiones regulares cuando hay saltos de línea
Publicado por: ‭lipman en 30 Junio 2011, 11:45 am
Muy bueno, no lo conocía!