domingo, 5 de septiembre de 2010

Expresiones regulares con PHP

Recordamos algunas reglas básicas para el uso y manejo de expresiones regulares en PHP.

Carácter Significado
\ Carácter de escape
^ Coincidencia al principio
$ Coincidencia al final
. Coincidencia con cualquier carácter excepto nueva línea \n
| Opción alternativa OR
( Inicio subpatrón
) Final subpatrón
* Se repite 0 o más veces
+ Se repite 1 o más veces
{ Inicio cuantificador min/max
} Final cuantificador min/max
? Subpatrón opcional
Carácteres especiales utilizados detro de corchetes
\ Carácter de escape
^ No, utilizado en una posición inicial
- Indica rangos de carácter

Veamos algunos ejemplos prácticos del uso de esta sintaxis con la ayuda de algunas funciones de PHP para buscar o reemplazar cadenas.

Podemos comprobar la existencia de subcadenas que coincidan con el patrón de la expresión regular con las funciones ereg() y eregi(). La única diferencia entre ellas es que eregi() es "case insensitive", es decir no diferencia entre mayúsculas y minúsculas, mientras que ereg() sí.

$cadena = "http://www.google.com";
ereg('^(http|https):\/\/', $cadena);
//devuelve true ya que la cadena
//empieza por http://

ereg_replace('^(http|https):\/\/', 'https://', $cadena);
//sustituimos http:// por https://

Otro función útil para el manejo de expresiones regulares con PHP es split. Con su ayuda podemos dividir cadenas y obtener un array con las subcadenas resultantes.

$cadena = "http://www.google.com";
$arr = split('\/\/|\.', $cadena);
while (list($k, $v) = each($arr)) {
 echo $v .'<br />'; 
}
//retorna
http:
www
google
com

Para realizar una comparación global de una expresión regular utilizamos la función preg_match_all() que buscará todas las coincidencias de la expresión regular dada y las introduce en un array en el orden que especifiquemos opcionalmente.

$cadena = "En el año 1942 Cristobal Colon descubrió américa. ";
$cadena .= "Murió en el 1506.";
preg_match_all("/[0-9]{4}/", $cadena, $coincidencias);
foreach ($coincidencias as $a) {
  foreach ($a as $v) {
    echo $v . '<br />'; 
  }
}
//imprime
1942
1506