Foros del Web » Programando para Internet » PHP »

Que expresion regular puedo utilizar para capturar esta cadena?

Estas en el tema de Que expresion regular puedo utilizar para capturar esta cadena? en el foro de PHP en Foros del Web. Hola. Que expresion regular puedo utilizar para capturar esta cadena: Código: $string=' <table align="center" width="100%" align="center"> y mucha info aquí ERICA y mucha info aquí</table> ...
  #1 (permalink)  
Antiguo 27/02/2013, 16:47
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Que expresion regular puedo utilizar para capturar esta cadena?

Hola.

Que expresion regular puedo utilizar para capturar esta cadena:

Código:
$string='
<table align="center" width="100%" align="center"> y mucha info aquí ERICA y mucha info aquí</table>
<table border="0" width="100%" align="center"> y mucha info aquí JORGE ZAPA y mucha info aquí</table>
<table 100%" border="0" align="center"> y mucha info aquí MARIA y mucha info aquí</table>
<table width="100%" border="0" align="center">JUAN</table>';
$expresion='/<table width="100%" border="0" align="center">MARIA<\/table>/s';
preg_match($expresion,$string,$coincidencia);
print_r($coincidencia);

Necesito capturar LA TABLA COMPLETA de MARIA, pero el único patrón CLAVE que tengo es que EN LA TABLA estará la cadena MARIA.

También pueden ver que los "estilos" de la tabla van en diferentes ordenes y a véces no los hay...

Solo eso tengo.

¿cómo puedo capturar esa tabla?

Gracias
  #2 (permalink)  
Antiguo 27/02/2013, 16:53
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

La única vaga (y errada) idea que tengo es:

Código PHP:
$expresion='@<table.*MARIA.*</table>@s'
Que como pueden ver, no funciona
  #3 (permalink)  
Antiguo 27/02/2013, 17:11
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Si el texto de entrada es exactamente lo que has puesto (sin subtags dentro de <table>), puedes usar

(<table[^>]*>[^<]*MARIA[^<]*</table>)

Si la cosa es más compleja, con subtags, etc, es mejor hacerlo via DOM
  #4 (permalink)  
Antiguo 27/02/2013, 17:25
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por dashtrash Ver Mensaje
Si el texto de entrada es exactamente lo que has puesto
Gracias DS, efectivamente contiene muchos TAGS e info.

Y adicionalmente, los datos estan en un STRING, deben parcearse, etc...

He de capturar "LA TABLA DE MARIA" utilizando la funcion preg_match().

Ayudame plis.
  #5 (permalink)  
Antiguo 27/02/2013, 17:42
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Prueba con esta:
(<table(?:.(?!<table|</table>))*MARIA(?:.(?!<table|</table>))*.</table>)

Te debe capturar la tabla más interna que contenga la palabra MARIA.(Es decir, en caso de tablas anidadas, devuelve la tabla más interna)
  #6 (permalink)  
Antiguo 27/02/2013, 18:42
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por dashtrash Ver Mensaje
Prueba con esta:
(<table(?:.(?!<table|</table>))*MARIA(?:.(?!<table|</table>))*.</table>)
100% efectivo!.

MUCHAS GRACIAS DT.

No sé cómo acceder a ese conocimiento...

Lo tomaste de un libro?, de un docente?

Carambas que ha funcionado!

Código PHP:
$string='
<table align="center" width="100%" align="center"> y mucha info aquí ERICA y mucha info aquí</table>
<table border="0" width="100%" align="center"> y mucha info aquí JORGE ZAPA y mucha info aquí</table>
<table 100%" border="0" align="center"> y mucha info aquí MARIA y mucha info aquí</table>
<table width="100%" border="0" align="center">JUAN</table>'
;
$expresion='@(<table(?:.(?!<table|</table>))*MARIA(?:.(?!<table|</table>))*.</table>)@s';
preg_match($expresion,$string,$coincidencia);
print_r($coincidencia); 


DT, utilizas Windows? (Yo sí) y tengo la "penosa" necesidad de pedirte un favor relacionado con la ayuda que acabas de brindarme.

Respondeme por favor, y nuevamente Gracias.
  #7 (permalink)  
Antiguo 28/02/2013, 01:54
Avatar de Ekel  
Fecha de Ingreso: noviembre-2009
Mensajes: 62
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

has escuchado de SIMPLE HTML DOM PARSER?

[URL="http://simplehtmldom.sourceforge.net/"]http://simplehtmldom.sourceforge.net/[/URL]
__________________
Black Nation Army
  #8 (permalink)  
Antiguo 28/02/2013, 06:40
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por Ekel Ver Mensaje
has escuchado de SIMPLE HTML DOM PARSER?

[URL="http://simplehtmldom.sourceforge.net/"]http://simplehtmldom.sourceforge.net/[/URL]
Gracias por tu aporte Ekel.

Tienes Windows?
Corres PHP como lo hace DT ?
También APACHE ?

... tengo una "pregunta loca"...
  #9 (permalink)  
Antiguo 28/02/2013, 10:02
Avatar de Ekel  
Fecha de Ingreso: noviembre-2009
Mensajes: 62
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por Anarko Ver Mensaje
Gracias por tu aporte Ekel.

Tienes Windows?
Corres PHP como lo hace DT ?
También APACHE ?

... tengo una "pregunta loca"...
A ver dime... (:
__________________
Black Nation Army
  #10 (permalink)  
Antiguo 28/02/2013, 12:46
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por Ekel Ver Mensaje
A ver dime... (:
Tienes Windows?
Corres PHP como lo hace DT ?
También APACHE ?
  #11 (permalink)  
Antiguo 28/02/2013, 17:38
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por Anarko Ver Mensaje
100% efectivo!.

No sé cómo acceder a ese conocimiento...

Lo tomaste de un libro?, de un docente?

Carambas que ha funcionado!
De usar negative lookahead..Si conoces eso, la regexp es simple.
Lo que no son simples son los casos de uso.Por ejemplo, esa regex falla si, dentro de la tabla que contiene MARIA, hay otra sub-tabla.
Modificándola, podría seguir haciendo match, pero la tabla que se cerraría no sería la tabla donde se encontró MARIA, sino la primera subtabla anidada que se encuentre tras MARIA.

Con regex es difícil (por no decir imposible) hacer "conteo" de cuántas tags se abren y se cierran.Si ese fuera un posible caso, hay que pasar a DOM parsing, ya que una estructura de tags es una estructura de árbol, mientras una regexp funciona intentando trabajar directamente sobre la cadena de entrada, lo que hace el "conteo" mucho más complejo.

Cita:
Iniciado por Anarko Ver Mensaje
DT, utilizas Windows? (Yo sí) y tengo la "penosa" necesidad de pedirte un favor relacionado con la ayuda que acabas de brindarme.
Respondeme por favor, y nuevamente Gracias.
Sí uso windows.

Última edición por dashtrash; 28/02/2013 a las 17:45
  #12 (permalink)  
Antiguo 28/02/2013, 18:32
Avatar de Ekel  
Fecha de Ingreso: noviembre-2009
Mensajes: 62
Antigüedad: 14 años, 5 meses
Puntos: 3
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por Anarko Ver Mensaje
Tienes Windows?
Corres PHP como lo hace DT ?
También APACHE ?

si.
__________________
Black Nation Army
  #13 (permalink)  
Antiguo 02/03/2013, 18:11
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por dashtrash Ver Mensaje
Sí uso windows.
Guao!, pues te comento que he corrido el siguiente código en mi PC, luego lo corrí en Windows+Apache+PHP de OTROS...

Y en todas ESAS PC el servidor se cae. No da error no de compilación ni de sintáxis... Simplemente Apache deja de funcionar...

Pero si quitas una o dos líneas, o aumentas en 50 véces el código, NO FALLA.

Es MUY extraño...

Correlo en tu Windows y cuéntame lo que sucede...

En LINUX va como una seda...

Valla intriga... ¿será un BUG de Apache?
Código PHP:
<?php
$ARRAY
[1]='
  <table width="100%" border="0" align="center" cellpadding="1" cellspacing="1">
  <tr>
    <td colspan="2" bgcolor="#EAEAEA" class="centro"><span class="centros"></title>
<style type="text/css">
.round-top{
    -ms-border-radius-topleft:3px;
    -ms-border-top-left-radius:3px;
    -moz-border-radius-topleft:3px;
    -webkit-border-top-left-radius:3px;
    -moz-border-radius-topright:3px;
    -webkit-border-top-right-radius:3px;
}
.centro {    text-align: center;
    font-size: 10px;
}
.centros {    text-align: justify;
}
.Estilo1 {color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; }
</style>
'
;
$XpR='@(<table(?:.(?!<table|</table>))*MARIA(?:.(?!<table|</table>))*.</table>)@s';
preg_match($XpR,$ARRAY[1],$k);
print_r($k);exit;
exit;
?>
  #14 (permalink)  
Antiguo 02/03/2013, 18:39
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Tendrías que ver el log de errores a ver que está pasando, porque ese código funciona en windows.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #15 (permalink)  
Antiguo 03/03/2013, 07:03
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Cita:
Iniciado por andresdzphp Ver Mensaje
funciona en windows.
Gracias.

Lo probé en 3 Windows diferentes, (2 W7 y un XP).

En los tres Apache deja de funcionar.
  #16 (permalink)  
Antiguo 03/03/2013, 10:21
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

y el log de errores de apache dice... ?
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #17 (permalink)  
Antiguo 23/03/2013, 08:11
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: Que expresion regular puedo utilizar para capturar esta cadena?

Hace menos de 24 horas fomatie mi PC.

Finalmente he logrado correr la extensión zend_extension con PHP-5.3.23-NTS para lo cual se requiere FastCGI.

Nuevamente corrí el "misterio.php" y ahora sí que sale
Código PHP:
Array ( ) 
Dado que corrí "misterio.php" en diferentes PC con Windows+PHP, y siempre tumbó el servidor, concluyo que se trata de un BUG sobre PHP en modo NO FASTCGI.

Por que estoy corriendo la misma versión de APACHE.

Salu2!

Etiquetas: expresion, regular, tabla
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 18:13.