Foros del Web » Programando para Internet » PHP »

Duda con Expresiones Regulares

Estas en el tema de Duda con Expresiones Regulares en el foro de PHP en Foros del Web. Buenas! Antes que nada, soy nuevo posteando en el foro, pero lo vengo leyendo hace rato (he aprendido un montón acá). También soy medianamente nuevo ...
  #1 (permalink)  
Antiguo 18/06/2011, 18:49
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 13 años, 5 meses
Puntos: 0
Pregunta Duda con Expresiones Regulares

Buenas! Antes que nada, soy nuevo posteando en el foro, pero lo vengo leyendo hace rato (he aprendido un montón acá). También soy medianamente nuevo en PHP, pero sobretodo cuando se trata de expresiones regulares

Estoy haciendo un pequeño "framework" o CMS personal, para poder desarrollar sitios dinámicos simples con gran velocidad y versatilidad (y de paso aprender más).

Les cuento brevemente cómo funciona: Un php interpreta una plantilla que está armada mediante etiquetas personalizadas incrustadas entre el html (similar al sistema que usa Tumblr).

Por ejemplo, si quiero poner una botonera, en la plantilla pongo esto:

Código:
{Botonera:}
    <a href="{Botonera_url}">{Botonera_tag}</a>
{:Botonera}
Y el php lo interpreta y lo reemplaza (mediante expresiones regulares) por el código definitivo.

Hasta ahí he podido lograrlo, usando la siguiente función:

Código PHP:
function reemplaza_botonera($array_links){
    global 
$plantilla;
    
$patron "~\{Botonera:\}(.*?)\{:Botonera\}~s";
    
    
preg_match_all($patron$plantilla$matchesPREG_SET_ORDER);
    
    
$reemplazo '';
    
    if(
$array_links){
    foreach(
$array_links as $aaa){
        
        
$subpatron = array("{Botonera_url}""{Botonera_tag}");
        
$subreemplazo = array($aaa['url'], $aaa['tag']);
        
$reemplazo .= str_replace($subpatron$subreemplazo$matches[0][1]);
        
    }
    }
    
    
$plantilla preg_replace($patron$reemplazo$plantilla);

Mi problema aparece cuando quiero poner más de una botonera, y que tengan una estructura distinta, por ejemplo:

Código:
<div id="botonera1">
    {Botonera:}
    <a href="{Botonera_url}">{Botonera_tag}</a>
    {:Botonera}
</div>

<ul id="botonera2">
    {Botonera:}
    <li><a href="{Botonera_url}">{Botonera_tag}</a></li>
    {:Botonera}
</ul>

Con el código que tengo, en #botonera2 me coloca el mismo contenido que en #botonera1 (pone sólo los <a>, en vez de <li><a>), y necesito que para cada una respete su estructura...

Supongo que tendría que agregar un loop más, en el que para cada coincidencia utilice su propio patrón y reemplazo...

Siempre recurro al manual de PHP, pero esta vez me cuesta un poco encontrar cuál sería la lógica para resolver el problema... Qué se les ocurre???

(Si no me expliqué bien, me avisan, y hago un esfuerzo más )

Les agradezco un montón si me pueden ayudar, me encuentro un poco estancado! Gracias!!!
  #2 (permalink)  
Antiguo 19/06/2011, 02:24
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Duda con Expresiones Regulares

No estoy muy seguro de esto, pero ya que estas obteniendo las coincidencias en $matches, creo que deberias hacer un ciclo para asignar los nuevos contenidos:

Código PHP:
Ver original
  1. foreach($matches as $match) {
  2.     $plantilla = preg_replace($match, $reemplazo, $plantilla);
  3. }

De esta forma vas reemplazando por bloque y no todo a la vez.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 19/06/2011, 14:09
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Duda con Expresiones Regulares

Muchas gracias Triby!!! la verdad que sí, puedo aprovechar el preg_matches_all para hacer otro ciclo... Probé lo que me dijiste, pero no puedo usar el $match del foreach como patrón para el preg_replace (me da error porque no es un string)...

Entonces probé esto:

Código PHP:
function reemplaza_botonera($array_links){
    global 
$plantilla;
    
$patron "~\{Botonera:(.*?)\}(.*?)\{:Botonera\}~s";
    
    
preg_match_all($patron$plantilla$matchesPREG_SET_ORDER);
    
    foreach(
$matches as $match){
        
        
$patron "~\{Botonera:$match[1]\}(.*?)\{:Botonera\}~s";
        
        
preg_match_all($patron$plantilla$submatchesPREG_SET_ORDER);
        
        
$reemplazo '';
        
        if(
$array_links){
        foreach(
$array_links as $link){
            
            
$subpatron = array("{Botonera_url}""{Botonera_tag}");
            
$subreemplazo = array($link['url'], $link['tag']);
            
$reemplazo .= str_replace($subpatron$subreemplazo$submatches[0][1]);
            
        }
        }
        
        
$plantilla preg_replace($patron$reemplazo$plantilla);

    }
    



Esto CASI resuelve el problema, pero en realidad para hacerlo funcionar, estoy generando un nuevo patrón con el resultado del match, ya que identifiqué a las dos botoneras, de esta forma:

Código:
<div id="botonera1">
    {Botonera:UNO}
    <a href="{Botonera_url}">{Botonera_tag}</a>
    {:Botonera}
</div>

<ul id="botonera2">
    {Botonera:DOS}
    <li><a href="{Botonera_url}">{Botonera_tag}</a></li>
    {:Botonera}
</ul>
Y quisiera resolver esto sin tener que identificar las botoneras, sino con el código que puse primero... Se entiende?
  #4 (permalink)  
Antiguo 19/06/2011, 14:23
 
Fecha de Ingreso: junio-2011
Mensajes: 3
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Duda con Expresiones Regulares

Necesitaría que existiera una función "preg_replace_all", jaja!
  #5 (permalink)  
Antiguo 19/06/2011, 18:59
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Duda con Expresiones Regulares

Parece que nos estamos complicando un poco las cosas, si $matches contiene exactamente las coincidencias y no expresiones regulares, entonces tal vez sea suficiente un simple str_replace()... prueba y ya nos contaras.
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: expresiones, preg_match_all, preg_replace, 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 01:16.