Uso de los modificadores en expresiones

Agregar a favoritos

12 Comentarios

Posteado hace 1488 días en:

Cuando le coges el truco a las expresiones regulares te das cuentas que aun no lo habías descubierto todo, como es el caso de los modificadores, son tremendamente útiles y sencillos de comprender.

Normalmente empiezas hacer una expresión pero te das cuenta que no funciona, que después de leerte ese maravilloso articulo no concuerda el resultado cuando cambias cualquiera cosa, pero lo podemos mejorar con los modificadores, los modificadores son pequeños comodines que hacen que la expresión case mucho mejor en la búsqueda. Veamos los 4 modificadores que uso con frecuencia en un ejemplo practico.

La expresión mas sencilla para sustituir un bbcode es sin duda esta:

*Nota: *hay que tener en cuenta que uso comillas simples y que el carácter para la expresión es !, esto es debido al articulo de earful, normalmente se usa la barra, pero con el signo de interrogación tienes menos posibilidades que aparezca.


preg_replace('![code](.+)[/code]!','<codigo>\\1</codigo>',$html);

Ejemplo:


[code]esto es un codigo[/code] a <codigo>esto es un codigo</codigo>

pero tiene un inconveniente y es que solo se comporta bien si existe un único tag, cuando añades mas, la expresión se vuelve avariciosa y abarca toda la búsqueda desde la primera apertura hasta la ultima.

Ejemplo:


[code]esto es un codigo[/code] y [code]esto es otro codigo[/code] 
a
<codigo>esto es un codigo[/code] y [code]esto es otro codigo</codigo>

Para eso usamos el modificador “U”, que hace que la expresion no se haga avariciosa y que case como nosotros queremos.


preg_replace('![code](.+)[/code]!U','\\1’,$html);

Ahora si que funciona, pero sigue teniendo mas errores, esa expresión solo vale si el tag aparece en una misma linea, en cuanto tenga un salto no funcionara, para ello usamos el modificador “s”, encargado de buscar que la expresión tenga o no saltos de linea.


preg_replace('![code](.+)[/code]!Us','<codigo>\\1</codigo>',$html);

Estos dos son sin duda los que mas uso pero os muestro dos mas, que son también muy útiles.

Por ejemplo usaremos el modificador “i” para que la expresión case tantos en mayúsculas como en minúsculas y acepte todas las combinaciones posibles.


preg_replace('![code](.+)[/code]!Usi','<codigo>\\1</codigo>',$html);

Ejemplo:


[code]esto es un codigo[/CODE] a <codigo>esto es un codigo</codigo>

Y por ultimo el modificador “e”, que ejecuta código php dentro de la misma expresión.


preg_replace('![code](.+)[/code]!Usie','"<codigo>".htmlentities("\\1")."</codigo>"',$html);

Ejemplo:


[code]esto es un <strong>codigo</strong>[/code] a <codigo>esto es un &gt;strong&lt;codigo&gt;/strong&lt;</codigo>

Así quedaría la expresión, normalmente no suelo usar todos los modificadores juntos porque depende de como hagas la expresión.Este código sustituye el tag bbcode [code]codigo[/code] por <codigo>codigo</codigo>
y ademas convierte todos los etiquetas html a sus entidades.

Esto unido a la función stript_tags es una bomba, porque así no tendremos que preocuparnos por las etiquetas malignas en los comentarios ;P.

Posdata: Sustituye correctamente el tag codigo por code, lo siento pero textile me hace unos extraños :s, puedes ver mejor la expresion en este codigo .


  • avatar

    Toad#1 hace 1488 días

    Buen artículo! :-)

  • avatar

    Nkieto#2 hace 1487 días

    Directo a mis bookmarks. Estupendo, muy aclaratorio!

  • avatar

    Tuxiradical#3 hace 1487 días

    Para que no se repitan con el primer y ultimo tag el (.+) puedes cambiarlo por (.*?)
    De esta forma yo lo he conseguido hacer ;)

    Saludos.

  • avatar

    Hermann#4 hace 1487 días

    Wow, mi IQ acaba de subir 20 puntos :D

    Muy buen artículo.

  • avatar

    IceBeat#5 hace 1487 días

    Gracias, hay muchos mas modificadores en el manual de php.net pero sin duda los mas utiles son estos. Tuxi pue sno lo sabia, hay mil formas para conseguir lo mismo resultados ;P.

  • avatar

    Jordi#6 hace 1487 días

    Me ha gustado el post, congratulations! :)

  • avatar

    IceBeat#7 hace 1485 días

    Gracias Jordi ;P.

  • avatar

    Fede#8 hace 1483 días

    Muy bueno, estaba teniendo problemas con las expresiones regulares, pero en estos días aprendí un par de cosas más =P

  • avatar

    IceBeat#9 hace 1483 días

    Las expresiones regulares para mi son muy divertidas pero algunas veces no sabes porque no responden como tu quieres y claro te haces la picha un lio :p.

  • avatar

    amor sin lucha#10 hace 1240 días

    la vida te presenta diversidades de amores el que te presenta la difilculta es el que te enamoras no se como llegar a ella puedo salir con otras pero amor a ella cimi puedo llegar?lucho todo lo que puedo pero no llego a encontrar la pisca para el amor entre ella y yo

  • chido

  • avatar

    vetino#12 hace 768 días

    vetino