
Tras una pequeña iniciación a las Expresiones Regulares, vamos a ver su aplicación en un contexto específico. Para ello utilizaremos PHP y las funciones ereg($expresion, $cadena) y ereg_replace($expresion ,$sustitución, $cadena).
Como ya me comentaron en menéame acerca del anterior articulo, también existen otras funciones basadas en PERL , que son más potentes, pero no son tan compatibles como las pintan, ya que la mayoría de los servidores traen desactivada la compatibilidad con ellas. Por ello decidí usar solo las funciones nativas de PHP.
El ejemplo que vamos a usar es el de eliminar HTML de unos ficticios comentarios de cara a su almacenamiento en una DB. Para ello ya existe la función strip_tags($cadena,[excepciones]), pero haremos como si no existiera para probar las Expresiones Regulares.
Lo primero que tenemos que tener claro es que patrón debemos simular: Buscamos una cadena de caracteres "encerrada" entre unas posibles etiquetas de HTML (que pueden ser reales o no). Por ejemplo: <b>Texto</b> ó <melkorcete>Texto</melkorcete>. Pero también vamos a poder eliminar etiquetas de XHTML como <img src="ola" />. Con esto lograremos una Expresión Regular bastante completa.
Vamos a desglosarla por partes para ir poco a poco.
// Por definición, debe comenzar por < seguido de cualquier caracter distinto a
// < y que se puede repetir de una a infinitas veces. Se cierra con > o sin él
// (de cara al XHTML se usa ? y no *)
$expresion = “<[^>]+>?”;
// Ahora el contenido de la etiqueta que debe ser cualquier caracter distinto de los corchetes
// y que puede o no existir (de cara al XHTML). Esta vez entre paréntesis para capturarlo después.
$expresion .= “([^>|^<]*)”;
// Ahora el cierre del HTML con la opcion de XHTML incluida
$expresion.= “\\/[^>]*>”;
// Lo que nos deja en total:
$expresion = “<[^>]+>?([^>|^<]*)\\/[^>]*>”;
Una vez conseguido el patrón, ahora vamos a crear nuestra función en PHP. Esta debe tener un comportamiento recurrente para solventar un posible anidamiento de etiquetas. Es decir, que también reemplace <b><i>hola</i></b> o casos parecidos:
// Limpiar HTML de una funcion
// $opcion define si la cadena de salida usara previamente un htmlentities();
function limpiarHTML($cadena,$opcion) {
$expresion = "<[^>]+>?([^>|^<]*)\\/[^>]*>”;
while (ereg($expresion,$cadena) == true) {
$cadena = ereg_replace($expresion,\’\\\\1\’,$cadena);
}
if ($opcion) {
return htmlentities($cadena);
} else {
return $cadena;
}
Con esta función ya tendríamos lo que necesitamos, que mientras que ereg() devuelva true (encontró una etiqueta) vaya reemplazando toda la etiqueta por solo el contenido.
Con esto creo que ya podéis haceros una idea del uso de las Expresiones Regulares , no obstante, próximamente pondré un artículo relacionado con .NET y las Regex.