Funciones PCRE

Funciones compatibles con Perl para expresiones regulares, que son usadas en muchos sistemas y lenguajes de programación como Apache o PHP.
Las funciones PCRE son "perl-compatibles". Perl es uno de los lenguajes de programación con mejor motor de expresiones regulares, y además es muy conocido. Esta librería es utilizada (con distintas variantes) no solo por Perl, sino por el propio PHP y tambien en otros entornos, como el server Apache, Phyton o KDE.

Las funciones de expresiones regulares PCRE de PHP son mas flexibles, potentes y rápidas que las POSIX.

Prácticamente no existe ninguna diferencia sintáctica entre un patrón PCRE o POSIX; muchas veces son intercambiables. Naturalmente existe alguna diferencia. La mas evidente, que nuestro patrón deberá estar marcado en su principio y final unos delimitadores, normalmente dos barras:

/patron/

Delimitadores

Se puede usar como delimitador cualquier carácter especial (no alfanumerico) salvo la barra invertida \.

La costumbre mas extendida es, como hemos visto, usar la barra /, sin embargo, si posteriormente vamos a necesitar incluir el mismo caracter delimitador en el patrón, tendremos que escaparlo, por lo que tiene sentido usar en esos casos unos delimitadores distintos: (), {}, [], o < >

Modificadores

Se colocan despues del patrón:

<?
m // multilínea. Si nuestra cadena contiene varias lineas físicas (\n)
  // respeta esos saltos de línea, lo que significa, por ejemplo,
  // que las anclas ^ $ no se aplican al principio y final de la
  // cadena, sino al principio y final de cada linea

s // El metacaracter . representa cualquier carácter menos el de
  // nueva linea. Con el modificador "s" tambien representa la nueva linea.

i // Se confronta el patrón con la cadena ignorando Mayusculas minusculas

x // ignora espacios (salvo que esten escapados o incluidos
  // específicamente dentro del rango de búsqueda. Ignora cualquier caracter
  // despues de almohadilla (#) hasta nueva línea. Sirve para incluir
  // comentarios y hacer mas legible el patrón.

e // solo en preg_replace. Evalua las ocurrencias como código php antes
  // de realizar la sustitución.

A // El patrón es forzado a ser "anclado", esto es, solo existirá una
  // ocurrencia si es al inicio de la cadena.

E // el carácter $ en el patrón casará con el fin de la cadena.
  // Sin este modificador, $ casa tambien con el carácter inmediatamente
// antes del de una nueva línea.

U // Este modificador invierte la "codicia" de los cuantificadores.
  // Si aplicamos U, * se convierte en perezoso (lazy) y *? vuelve a su
  // comportamiento normal.
  // Un cuantificador es "codicioso" (greedy) cuando intenta capturar todas
  // las ocurrencias posibles, y perezoso (lazy) cuando captura la
  // ocurrencia mas corta. ?>


Delimitadores de palabra

En las funciones PCRE puedes usar \b que indica el comienzo y fin de una palabra (o mejor, de una secuencia alfanumerica):
/\bpatron\b/

\B, por el contrario, se refiere a un patrón que no está al comienzo o fin de una palabra.

Codicioso o no

Las expresiones regulares que usan cuantificadores tienden a ser todo lo codiciosas que les sea permitido, siempre que respeten el patrón a seguir. Con el modificador U se invierte este comportamiento.

En modo codicioso el patrón casará todas las ocurrencias que pueda, mientras que en modo lazy o ungreedy, casará solo la mas corta posible (e).
Advierte que las dos soluciones son correctas.

patrón: /http:\/\/.*\.(com|net|org)/esto es un link: http://www.abc.com y este otro mas: http://www.blah.com

patrón: /http:\/\/.*\.(com|net|org)/Uesto es un link: http://www.abc.com y este otro mas: http://www.blah.com

Las funciones

Tenemos cinco funciones PCRE:

preg_match()
preg_match_all()
preg_replace()
preg_split()
preg_grep()

preg_match busca el patrón dentro de la cadena, devolviendo TRUE si es hallado:
patron, cadena [,array de resultados]

Si indicamos el tercer parámetro, tendremos los resultados en un array; $array[0] contendrá la ocurrencia del patrón; $array[1] tendrá la cadena que case con el primer subpatrón y así sucesivamente.

preg_match_all encuentra todas las ocurrencias del patrón en la cadena.
patron, cadena, array de patrones, orden

Si proporcionamos el cuarto parámetro, colocara las ocurrencias en un array siguiendo el orden indicado.

preg_replace busca y reemplaza el patrón en la cadena. Tanto el patrón como la sustitución pueden pasarse en array, y pueden contener expresiones regulares.
Puede tambien especificarse un límite máximo de ocurrencias.

preg_split opera como split aunque tambien puedes pasarle expresiones regulares

preg_grep busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.
patron, array

El autor de este artículo ha creado una herramienta para probar expresiones regulares, que seguro nos será de utilidad para comprobar nuestros conocimientos.

Autor

irv.

Compartir

Comentarios

Faustino

14/2/2008
Podrias poner un ejemplo...
como que necesito eliminar todos los correos que vienen de una direccion y van dirigidos a otra especificamente...

pero la cabecera del correo tiene varias lineas y saltos de linea
como podria hacer la expresion regular para buscar from:correox@xxx to: correoy@xxx

gracias

Faustino

14/2/2008
Podrias poner un ejemplo...
como que necesito eliminar todos los correos que vienen de una direccion y van dirigidos a otra especificamente...

pero la cabecera del correo tiene varias lineas y saltos de linea
como podria hacer la expresion regular para buscar from:correox@xxx to: correoy@xxx

gracias