Foros del Web » Programando para Internet » PHP »

Expresiones regulares recursivas

Estas en el tema de Expresiones regulares recursivas en el foro de PHP en Foros del Web. Hola a todos, tengo la siguiente expresión regular recursiva en PHP (http://www.php.net/manual/es/regexp.reference.recursive.php): @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $pattern =   '/\{\{(([^{}]*|(?R))*)\}\}/is' ; que funciona ...
  #1 (permalink)  
Antiguo 17/08/2011, 13:54
 
Fecha de Ingreso: agosto-2011
Mensajes: 5
Antigüedad: 12 años, 8 meses
Puntos: 0
Pregunta Expresiones regulares recursivas

Hola a todos,

tengo la siguiente expresión regular recursiva en PHP (http://www.php.net/manual/es/regexp.reference.recursive.php):


Código PHP:
Ver original
  1. $pattern =  '/\{\{(([^{}]*|(?R))*)\}\}/is';


que funciona perfectamente para llaves anidadas, es decir, aceptaría las siguientes entradas:

{{infobox | () funciona correctamente }}
{{segundo ejemplo {{esto tambien}} funciona}}
{esto no} --> ésta no, porque no tiene doble {{ }}

Mi problema es que quiero que acepte entradas igual a las anteriores pero que comiencen por infobox, por ejemplo:

{{infobox {{texto}} }} --> que la acepte
{{otrapalabra }} --> no lo acepte

He probado de mil maneras (menos con la correcta jeje).

Un saludo y gracias
  #2 (permalink)  
Antiguo 17/08/2011, 15:02
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Expresiones regulares recursivas

Solo es cuestión de añadir otro | y la expresión que quieres tomar. ¿Qué haz hecho y no te ha salido?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 17/08/2011, 18:39
 
Fecha de Ingreso: agosto-2011
Mensajes: 5
Antigüedad: 12 años, 8 meses
Puntos: 0
Respuesta: Expresiones regulares recursivas

He probado lo de añadir un nuevo caso | (OR) de la siguiente manera:

Código PHP:
Ver original
  1. $re = '/\{\{((infobox|[^{}]*|(?R))*)\}\}/is';

pero no funciona porque creo que la expresión [^{}]* ya selecciona cualquier cosas que no sean paréntesis (incluyendo dicha palabra).

También he probado con:

Código PHP:
Ver original
  1. $re = '/\{\{infobox(([^{}]*|(?R))*)\}\}/is';
  2. $re = '/\{\{(?=infobox)(([^{}]*|(?R))*)\}\}/is';

La cuestión es que tengo que forzar que empiece por "{{infobox" que le siga cualquier cosa y termine con }} algo como: {{infobox subpatrón}}

subpatrón --> cualquier cosa incluso llaves anidadas...
{{infobox | () {{}} mas palabras}} --> OK
{{willy {{esto tambien}} wonka}} --> no empieza por {{infobox
{esto tambien} --> no tiene dos llaves
{{infobox {{lo que sea}} mas }} --> OK

Creo que es un matiz que no termino de ver...

Saludos!!

Saludos
  #4 (permalink)  
Antiguo 19/08/2011, 04:14
 
Fecha de Ingreso: agosto-2011
Mensajes: 5
Antigüedad: 12 años, 8 meses
Puntos: 0
Sonrisa Respuesta: Expresiones regulares recursivas

Ya por fin encontré la solución, al final he usado otra expresión que viene a significar lo mismo, la dejo por si hay alguien que le interese:

/\{\{infobox(((?:[^{}]++|\{(?1)\})*))\}\}/is

Saludos!!

Etiquetas: expresiones, regulares
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 12:23.