2009-07-29 11 views
6

Estoy tratando de crear etiquetas personalizadas simples para permitir plantillas personalizadas en mi aplicación. Pero no puedo descifrar cómo analizar y reemplazar las etiquetas.Análisis de etiquetas personalizadas con PHP

(ejemplo)

<div class="blog"> 
<module display="posts" limit="10" show="excerpt" /> 
</div> 
<div class="sidebar"> 
<module display="users" limit="5" /> 
<module display="comment" limit="10" /> 
</div> 

para cada etiqueta módulo encontrado, que desea ejecutar la función de creación de módulo con los parámetros (que figuran en la etiqueta como atributos). Y reemplace la etiqueta del módulo, con un fragmento de HTML real que se devuelve de la función.

Respuesta

9

Puede usar expresiones regulares para que coincidan con sus etiquetas personalizadas.

$html // Your html 

preg_match_all('/<module\s*([^>]*)\s*\/?>/', $html, $customTags, PREG_SET_ORDER); 

foreach ($customTags as $customTag) { 
$originalTag=$customTag[0]; 
$rawAttributes=$customTag[1]; 

preg_match_all('/([^=\s]+)="([^"]+)"/', $rawAttributes, $attributes, PREG_SET_ORDER); 

$formatedAttributes=array(); 

foreach ($attributes as $attribute) { 
    $name=$attribute[1]; 
    $value=$attribute[2]; 

    $formatedAttributes[$name]=$value; 
} 

$html=str_replace($originalTag, yourFunction($formatedAttributes), $html); 
} 

Si desea tomar un aproach XML, en contacto conmigo y te voy a mostrar cómo hacerlo.

+3

en serio? ¿Por qué usar regex cuando es mucho más lento que las funciones integradas en XML? – icco

+2

Realmente no es más lento. –

3

http://us3.php.net/manual/en/function.preg-replace-callback.php

Mi pareja ha hecho un trabajo con el análisis de etiqueta ... dependiendo de la complejidad que se desea lograr, es posible que desee utilizar expresiones regulares. Use expresiones regulares para buscar etiquetas, y luego puede dividir las cadenas aún más con las funciones de manipulación de cadenas de su preferencia. La función de devolución de llamada en preg_replace_callback le permitirá reemplazar la etiqueta con los datos html que desee que represente. ¡Aclamaciones!

edición: (< módulo + ([^ =] + = "[^"] * ")/>??????) Debe coincidir con las funciones del módulo ... quitar el espacio entre el < y el módulo (SO lo está analizando incorrectamente). En su función personalizada, haga coincidir los parámetros individuales contenidos en la etiqueta, usando una expresión regular como: ([^ =] +? = "[^"]? ")

3

Puede analizar su archivo usando simplexml y recuperar los atributos después de recorrer y encontrar sus elementos. Aquí hay un example.

+0

Si escribió el código para explicar exactamente cómo hacerlo, esta respuesta podría haberse aceptado. – icco

2

Como Natso sugerido preg_replace_callback es ideal para este tipo de solución.

Otra opción sería leer la plantilla/archivo en formato XML, si está esperando validar el marcado XML, con el XmlReader y actuar en los nodos correspondientes. Como sugerencia adicional, es posible que desee utilizar Xml Namespaces para sus etiquetas personalizadas, ya que esto garantizará que no haya colisiones.

Cuestiones relacionadas