Foros del Web » Programando para Internet » PHP »

preg_match_all con saltos de línea y tabulaciones

Estas en el tema de preg_match_all con saltos de línea y tabulaciones en el foro de PHP en Foros del Web. Estoy tratando de capturar un texto de una web externa para mostrarlo en la mia. El texto en concreto es este: Código HTML: <div class= ...
  #1 (permalink)  
Antiguo 11/12/2012, 16:10
 
Fecha de Ingreso: octubre-2007
Ubicación: Dentro de un <div>
Mensajes: 39
Antigüedad: 16 años, 6 meses
Puntos: 0
Pregunta preg_match_all con saltos de línea y tabulaciones

Estoy tratando de capturar un texto de una web externa para mostrarlo en la mia. El texto en concreto es este:

Código HTML:
<div class="txt_celda">
      
								Nieblas
<br></br>
      
								Visibilidad : 100 m
<br></br>
</div> 
Mi intención es capturar con preg_match_all los 2 valores (Nieblas y Visibilidad: 100m) en el array que devuelve preg_match_all y mostrarlos en mi web.

El problema viene con los saltos de línea y esas pedazo de tabulaciones que tiene el texto. Son de la web de AEMET.

Para capturar una línea sin saltos, fácil:

Código PHP:
$regexp='/(?:<td\ class=\"borde_rlb\"\ colspan=\"4\">)(.+)(?:<\/td>)/'
y me captura en el array lo que hay en (.+), o sea, entre las etiqutas <td>.

Uso la misma expresión para lo que he explicado antes, pero me devuelve un error contínuamente, que imagino que será por los saltos de línea. La expresión que uso es esta:

Código PHP:
$regexp='/(?:<div\ class=\"txt_celda\">)(.+)(?:<\/div>)/'
He intentado jugar con los modificadores de las expresiones regulares, \s, \n, \t, pero... o no sé dónde usarlos o algo falla, porque me tira este error:

Notice: Undefined offset: 0 in C:\wamp\www\tiempova4\index.php on line 2634

¿Me orientáis un poco por dónde seguir, por favor?
  #2 (permalink)  
Antiguo 11/12/2012, 17:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: preg_match_all con saltos de línea y tabulaciones

El modificador \s significa espacio, tabulación, etc.

La idea es colocarlo al rededor de lo que buscas capturar.
Cita:
\s*(.+)\s*
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/12/2012, 09:38
 
Fecha de Ingreso: octubre-2007
Ubicación: Dentro de un <div>
Mensajes: 39
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: preg_match_all con saltos de línea y tabulaciones

Ya lo había intentado así, pero me tira otro error diferente.

Notice: Array to string conversion in C:\wamp\www\tiempova4\index.php on line 2634

Por lo que entiendo ahí, tiene problemas para convertir el array en una cadena de texto, ¿no?

pongo la función entera que uso para capturar y luego mostrar lo capturado.

Código PHP:
$contenido=file_get_contents('aqui_se_escribe_la_web_de_donde_capturamos_los_datos');
$regexp='/(?:<div\ class=\"txt_celda\">)\s*(.+)\s*(?:<\/div>)/';
preg_match_all($regexp,$contenido,$avisomet);
echo 
$avisomet[0]; 
Uso $avisomet[0] para que me muestre el array entero en caso de que capture algo, luego ya lo adaptaría.

¿Alguna idea?
  #4 (permalink)  
Antiguo 12/12/2012, 09:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: preg_match_all con saltos de línea y tabulaciones

Con preg_match_all() obtienes un arreglo de dos dimensiones, tu sólo imprimes una y por ende el error.

Si quieres examinar el contenido debes usar print_r() o var_dump(), de cualquier forma podrías igualmente imprimir el índice especifico.
Código PHP:
echo $foo[0][1]; 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 12/12/2012, 09:51
 
Fecha de Ingreso: octubre-2007
Ubicación: Dentro de un <div>
Mensajes: 39
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: preg_match_all con saltos de línea y tabulaciones

Estaba editando y no me ha dejado guardar porque ya habías respondido. Qué velocidad xD. Gracias por tu interés.

Ya había probado con:

Código PHP:
print_r($avisomet[0]); 
y aunque no tira errores, muestra el array vacío:

Array ()

Creo que no captura el texto, no entiendo porqué.

Con var_dump me devuelve:

array (size=0)
empty


O sea, vacío. Confirmo mis sospechas, ¿no?

¿los <br> se interpretan como espacios en blanco o como cualquier otra etiqueta?

Última edición por yllelder; 12/12/2012 a las 10:12
  #6 (permalink)  
Antiguo 12/12/2012, 10:26
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: preg_match_all con saltos de línea y tabulaciones

Los <br> son otra cosa, son HTML, no son espacios en blanco precisamente.

Sin embargo prueba así:
Cita:
/<div\ class=\"txt_celda\">(.+?)<\/div>/is
Tienes un exceso de cosas que seguramente no entiendes, si funciona te invito a consultar una referencia para que veas lo que hace.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 12/12/2012, 10:43
 
Fecha de Ingreso: octubre-2007
Ubicación: Dentro de un <div>
Mensajes: 39
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: preg_match_all con saltos de línea y tabulaciones

No te puedo decir que sepa de memoria cada comando que he puesto en la expresión regular ya que la construí "sobre la marcha" con la referencia de PHP en mano para obtener el texto de una sola línea, y funcionaba

Por lo tanto la copié tal cual para intentar adaptarla a capturar varias líneas, que es lo que intentamos.

Pero te aseguro que la expresión funciona perfecto con una línea.

El que código que me propones no funciona, sigue dejando el array vacío. No me lo explico.
  #8 (permalink)  
Antiguo 12/12/2012, 11:20
 
Fecha de Ingreso: octubre-2007
Ubicación: Dentro de un <div>
Mensajes: 39
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: preg_match_all con saltos de línea y tabulaciones

¡Solucionado!

Explico porqué no funcionaba.

Resulta que la primera etiqueta HTML:

Código HTML:
<div class="txt_celda" > 
lleva un espacio entre la última comilla doble y el > de fin de etiqueta que no había tenido en cuenta en la expresión regular.

La expresión queda así:

Código PHP:
$regexp='/<div\ class=\"txt_celda\"\ >(.+?)<\/div>/is';
preg_match_all($regexp,$contenido,$avisomet);
echo 
$avisomet[1][0]; 
Gracias por todo pateketrueke.

Etiquetas: expresiones_regulares, preg_match_all, tabulacion
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 05:05.