Foros del Web » Programación para mayores de 30 ;) » RegExp »

[SOLUCIONADO] Expresiones regulares PCRE

Estas en el tema de Expresiones regulares PCRE en el foro de RegExp en Foros del Web. Buenas a todos. Tengo una duda con las expresiones regulares. Sólo las he usado una o dos veces pese al potencial que tiene y estoy ...
  #1 (permalink)  
Antiguo 25/06/2013, 06:48
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Expresiones regulares PCRE

Buenas a todos.

Tengo una duda con las expresiones regulares. Sólo las he usado una o dos veces pese al potencial que tiene y estoy intentando usarlas más pero no consigo que funcione lo siguiente:

Código PHP:
        $html "<html  lang=\"es\">
                <head>
                <title>Texto de prueba :D</title>"
;
        
        
$pattern "@<html(.*|\s*)</title>@i";
        
preg_match($pattern$html$match);
        
        echo 
$match[1]; 
Lo que quiero que haga es que retorne todo lo que hay entre una cosa y otra. En este caso son elementos de html.

El output creo que debería ser:
Código:
  lang=\"es\">
				<head>
				<title>Texto de prueba :D
Pero no es así. No me retorna nada y yo creo que se debe al grupo de carácteres admitidos entre los dos elementos. Si pongo (.*\s) me funciona pero sólo con un salto de línea (tened en cuenta que en el documento que intento procesar la estructura hace saltos de línea que se procesan como \s).

Así que mi pregunta es cómo puedo definir bien que quiero que entre los elementos pueda haber cualquiér carácter (.*), y salto de línea 0 o más veces porque con (.*\s*) no me funciona, ni con (.\s*), ni con (.*|\s*)... En fin. Perdon si mi problema es muy sencillo.

Saludos.
  #2 (permalink)  
Antiguo 25/06/2013, 07:12
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresiones regulares PCRE

Las expresiones regulares son un sub-lenguaje, así que como cualquier otro deberías apoyarte en una referencia del mismo para poder comprender.

No es algo que debes preguntar en el foro de PHP ciertamente, para eso existe el sub-foro de RegExp.

Mientras mueven tu tema al lugar correcto lee lo siguiente: http://www.forosdelweb.com/f18/aport...s-pcre-646110/

También pudiste haber buscando antes de abrir el tema, te sugiero aprender a usar el foro antes de continuar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 25/06/2013, 08:24
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Expresiones regulares PCRE

Gracias por contestar.

Por supuesto que busqué antes respecto a esto en éste mismo foro pero no resolví mi duda. El post que hiciste tú sobre las expresiones PCRE al que me acabas de enlazar ya lo había leído. Mi problema no es respecto a la cantidad de operadores que hay en las expresiones regulares, sino respecto a la sintaxis de las mismas. Perdon si no fui claro.

Lo que no tiene excusa es mi equivocación al poner el tema en el foro de PHP. Lo siento por ello y espero que lo muevan.

Respecto a lo de que las expresiones regulares son un sub-lenguaje no tenía conocimiento. Ruego que me disculpes tú, y los siguientes colaboradores.

Última edición por hackabyss01; 25/06/2013 a las 08:26 Razón: Falta de contenido.
  #4 (permalink)  
Antiguo 25/06/2013, 08:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresiones regulares PCRE

Los operadores de RegExp son sintáxis también, así que sigo sin entender qué parte no entiendes, la combinación de varios operadores establece la lógica de una expresión.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 25/06/2013, 09:27
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Expresiones regulares PCRE

A ver.

¿Es esto correcto?
Código:
@<head>(.\s*)</head>@i
Ese patrón está bien escrito así? Busco mostar el contenido entre <head> y </head> así que tengo que especificar que entre medias de esos dos elementos puede ir cualquiér carácter 0 o más veces (.*), y saltos de línea-espacios-tabulaciones 0 o más veces (\s*) así que es correcto agruparlo dentro de los paréntesis como he hecho yo?

He probado en un script php que he hecho y es que no me retorna lo que quiero... Pero ya no sé si es otro problema como por ejemplo que tiene algún otro carácter especial que no está englobado en el operador "." o que mi patrón está mal.
  #6 (permalink)  
Antiguo 25/06/2013, 09:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresiones regulares PCRE

Los paréntesis sirven para hacer matching y agrupar otro tipo de condiciones.

Siguiendo lo que buscas:
Cita:
cualquiér carácter 0 o más veces (.*), y saltos de línea-espacios-tabulaciones 0 o más veces (\s*)
Debería ser así:
Cita:
@<head>([.\s]*)</head>@i
En breve, [.\s]* básicamente significa "lo que sea, incluyendo espacios, cero o más".
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 25/06/2013, 10:02
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Expresiones regulares PCRE

Pues no me funciona. Sigue sin retornarme nada. Dejo lo que puse:

Código PHP:
        $pattern "@<head>([.\s\t]*)</head>@i";
        
preg_match($pattern$html$match);
        
        echo 
$match[1]; 
He añadido también tabulaciones por si acaso las tiene el archivo pero nada.

Gracias por resolverme el tema de las agrupaciones.
  #8 (permalink)  
Antiguo 25/06/2013, 10:12
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresiones regulares PCRE

¿Es posible ver el HTML de prueba para entender lo que te hace falta?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 25/06/2013, 10:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Expresiones regulares PCRE

Creo que te falta el operador "m" para indicarle que el match sea multilinea...
  #10 (permalink)  
Antiguo 25/06/2013, 11:25
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Expresiones regulares PCRE

Código PHP:
        $html '<tr>
                <td id="menu"><a href="">Hello world</a></td>
                <td id="menu"><a href="">Another menu</a></td>
                <td id="menu"><a href="">Another menu</a></td>
                <td id="menu"><a href="">Another menu</a></td>
            </tr>'
;
        
        
$pattern "@<tr>([.\s\t\n\"\/]*)</tr>@im";
        
preg_match($pattern$html$match);
        
        echo 
$match[1]; 
Ese es el ejemplo que estoy probando para patrones por si era cosa del contenido del otro documento pero con éste tampoco funciona.
  #11 (permalink)  
Antiguo 25/06/2013, 14:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresiones regulares PCRE

Dependiendo de lo que buscas no hay que ser tan religioso, yo me equivoqué en la expresión anterior, al usar el meta-caracter . (punto) dentro de corchetes representa el punto literal y ya no más "cualquier cosa".

Eso pasa con la mayoría de meta-carácteres, con sus propias reglas y excepciones.

Ahora, el modificador "m" no es necesario desde que no se busca comparar linea por linea sino el cuerpo completo sin importar los saltos de linea, etc.

Así pues la expresión es aún más simple: @<tr>(.*)</tr>@is

Al incluir el modificador "s" el . (punto) se modifica y pasa a abarcar también caracteres "blancos" como el salto de linea, tabulador, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 25/06/2013, 16:15
 
Fecha de Ingreso: mayo-2013
Mensajes: 8
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Expresiones regulares PCRE

De esa forma sí que funciona. Muchísimas gracias por haber invertido vuestro tiempo en ayudarme.

Establezco el tema como resuelto. De nuevo gracias.

Etiquetas: expresiones, html, php, regulares, zend
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 19:45.