Tipos de funciones para expresiones regulares

Los dos tipos funciones básicas para trabajar con expresiones regulares en php. Diferencias entre ereg y preg.

Para trabajar con expresiones regulares en php hay dos grupos de funciones, las que empiezan por ereg y las que empiezan por preg. Las funciones ereg no necesitan ninguna librería adicional, pero no soportan la sintaxis moderna de expresiones regulares. Las funciones preg estan pensadas para soportar toda la sintaxis (Compatible con Perl) de las expresiones regulares y son más rápidas. Sin embargo, necesitan tener instalada la librería PCRE en el servidor donde se ejecutan. Es recomendable usar las funciones ereg si no dispones de un servidor propio para instalar las librerías requeridas.

Las funciones ereg

En estas funciones las expresiones regulares deben mostrarse como una cadena de caracteres. Por ejemplo la función ereg

ereg('expresionregular',"cadena")

Comprueba si la expresionregular existe dentro de la cadena (case-sensitive, usar la función eregi para case-insensitive). Devuelve la longitud de la coincidencia si se encontró, o zero si no se encontraron coincidencias u ocurrió algún error. Es común utilizarlo dentro de estructuras condicionales (if) ya que 0 se evalúa a falso y el resto como verdadero.

Se deben usar comillas simples cuando se pasa una expresión regular como un literal. Algunos caracteres como el dolar ($) y la contra barra (\) son caracteres especiales en cadenas con comillas dobles, pero no en cadenas PHP de comillas simples.

La función ereg_replace

echo ereg_replace('expresionregular', "reemplazo", $cadena );

Esta función examina la cadena buscando coincidencias de expresionregular, y reemplaza el texto encontrado con la el contenido de la cadena reemplazo. También existe la función eregi_replace para case-insensitive.

Las funciones preg

En las funciones preg se debe utilizar la sintaxis Perl. De manera que las expresiones regulares en PHP con esta función deben ir entre barras. Ejemplo:

preg_match('/expresionregular/',$cadena);

Es por esto que si deseamos usar caracteres '/' dentro de una expresión regular antes deberemos escapar el caracter con una contrabarra. Ejemplo:

preg_match('/http:\\/\\/www.webtutoriales.com\\//',$cadena);

Si queremos usar las instrucciones preg en modo case insensitive deberemos poner el parámetro 'i' al final de la expresión regular. Ejemplo:

preg_match('/expresionregular/i',$cadena);

Hay más parámetros como 'm', o 's' (lista completa de modificadores). Para usar más de uno a la vez basta con ponerlos uno detrás de otro:

preg_match('/expresionregular/ims',$cadena);

La función preg_match_all guarda en un array (en nuestro ejemplo la variable $resultados) todas las ocurrencias encontradas dentro de la string "$cadena" que cumplen con la expresión regular.

preg_match_all('expresionregular',$cadena,$resultados);

Finalmente la función preg_replace, igual que ereg_replace te permite reemplazar una cadena por otra si se encuentran ocurrencias de la expresión regular.

Ejemplos Útiles

1. Ejemplo para comprobar si la sintaxis de un email es correcta o no (devuelve 1 si es cierto 0 si no lo es).

preg_match("/^([a-zA-Z0-9])+@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-]+)+/", "[email protected]");

2. En este caso utilizaremos la función preg_replace para censurar determinadas palabras en una cadena. (Reemplazaremos las palabras del array por asteríscos.)

$cadena = "La primera palabra y la segunda palabra y la tercera...";
$malaspalabras = array("primera","segunda","tercera");
$numero_palabras = count($malaspalabras);
$i = 0;
while ($i < $numero_palabras) {
  $cadena = str_replace ("$malaspalabras[$i]", " \*\*\*\* ", "$cadena");
  $i++;
}

echo $cadena;

3. Este ejemplo sirve para extraer 10 caracteres de una cadena de modo que no corte palabras por la mitad. (extraído de php.net)

$expresionregular = "/(^.{0,10})(\\W+.\*$)/";

$cadena = "El veloz murciélago hindú comía feliz cardillo y kiwi";

$reemplazo = "\\${1}";

echo preg_replace($expresionregular, $reemplazo, $cadena); //devolverá la cadena "El veloz" (8 caracteres).