Reemplazar etiquetas <ul> por <div> en PHP

GreyShock

Hamijos! Necesito ayuda de PHP. Tiene que ver con expresiones regulares, que no son mi punto fuerte.

Estoy montanto un menú personalizado para una plantilla de Wordpress y el problema que tengo es que al cargar un custom menú en WP te lo devuelve en estructura <ul><li>, y dada la maquetación específica de mi menú necesito que sea una estructura de divs bastante peculiar.

Para no hacer la guarrada de extraer lo que necesito del menú con javascript y pegarlo dentro de mi estructura, estoy intentando "limpiarlo" de la variable que recibo con la estructura de menús.

Por ahora ando tal que así:

<div id="cargador_menu">
        <?php
        $foot_nav = wp_nav_menu(array('theme_location' => 'primary',
        'container' => false,
        'echo' => false));
        $foot_nav2 = preg_replace(array('#^<ul[^>]*>#', '#</ul>$#'), '', $foot_nav);
        $foot_nav2 = preg_replace(array('#<li[^>]*>#', '#</li>$#'), array('<div>','</div>'), $foot_nav2);
        echo $foot_nav2;
      ?>
</div>

para hacer desaparecer el UL que engloba todo guay, no hay problema, pero mi conflicto viene al intentar remplazar las etiquetas <li> por <div>, no me lo está haciendo correctamente, me sale un resultado final así:

	<div><a href="http://www.jordidepaco.com">Submenú</a>
	<div><a href="http://www.google.com">Google miau miau</a>
	<div><a href="http://www.gatitos.com">Gatitos bonitos</a>
        </div></div></div>

osea, la etiqueta inicial de los <li> la sustituye correctamente, pero luego me los cierra todos al FINAL en lugar de donde estaba el </li> original...

¿Dónde puedo haberme colado?

LOc0

Prueba a ver así:

$foot_nav = preg_replace(array('#< *?/? *?ul[^>]*>#i','#(< *?/?)li([^>]*>)#i'), array('', '\1div\2'), $foot_nav);

Salu2 ;)

2 1 respuesta
GreyShock

#2 Muchas gracias! Funciona!

Ahora lo tunearé para que cumpla mis deseos :3

Mi única duda es, que hace exactamente '\1div\2' ?? Ahí me he perdido.

EnZo

Sirve para escapar los grupos que has hecho previamente. (< ?/?) \1 eso seria el primer grupo. Y este el segundo ([>]> ) \2

1 respuesta
GreyShock

Uff... estoy muy perdido. Muchas gracias por la explicación. Voy a tener que ponerme a estudiar en serio expresiones regulares para subir el nivel de mi programación. Siempre las he evitado en la medida de lo posible, pero ha llegado el momento de dominarlas. #4

Alguna recomendación de manuales? O mejor un tuto por internet?

Me gusta mucho leer libros de desarrollo, poco a poco voy a teniendo una bonita y útil colección :)

EnZo

No sabria decirte ninguna pagina en concreto para aprender. Pero habran miles buenos, yo sé que aprendí de varias conforme lo iba necesitando.

Lo que si te puedo pasar es esta pagina que para probar de forma rapida con las funciones de php viene de lujo:
http://www.spaweditor.com/scripts/regex/index.php

1 respuesta
GreyShock

#6 Bueno, pues a la aventura entonces. Ya investigaré. Me guardo esta chachi herramienta ;)

GreyShock

Al final he resuelto el tema de mi custom menú con otra función de Wordpress algo más "oculta", y evito las expresiones regulares :P

Por si os interesa u os hace falta en un futuro, posteo la función que te devuelve el menú de WP como un array de objetos.

wp_nav_menu() <--- esta es la que te monta el menú con UL y LI

esa función utiliza:

wp_get_nav_menu_items($menu_id)

Para montar su estructura antes de devolverla como un string. Así que de ahí podemos pillar el array de objetos de menú para moldear a gusto nuestro custom menú.

Y esta es la estructura de un objeto de menú de WP si os pica la curiosidad:

stdClass Object
(
    [ID] => 33
    [post_author] => 1
    [post_date] => 2012-01-09 10:44:35
    [post_date_gmt] => 2012-01-09 10:44:35
    [post_content] =>  
[post_title] => [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => 33 [to_ping] => [pinged] => [post_modified] => 2012-02-28 13:40:14 [post_modified_gmt] => 2012-02-28 13:40:14 [post_content_filtered] => [post_parent] => 0 [guid] => http://localhost/adeit/?p=33 [menu_order] => 1 [post_type] => nav_menu_item [post_mime_type] => [comment_count] => 0 [filter] => raw [db_id] => 33 [menu_item_parent] => 0 [object_id] => 2 [object] => page [type] => post_type [type_label] => Página [ url] => http://localhost/adeit/sample-page/ [title] => Sample Page [target] => [attr_title] => [description] => [classes] => Array ( [0] => ) [xfn] => )

Muchas gracias por la ayuda! ;)

Usuarios habituales

  • GreyShock
  • EnZo
  • LOc0