Funciones PHP para expresiones regulares

Explicación de algunas funciones que dispone PHP para el trabajo con expresiones regulares.
PHP tiene dos conjuntos distintos de funciones relacionadas con expresiones regulares, llamadas POSIX y PCRE.

Las funciones "PCRE" son "PERL Compatible", es decir, similares a las funciones nativas Perl, aunque con ligeras diferencias. Son bastante mas poderosas que las funciones POSIX, y correlativamente mas complejas.

POSIX
Incluye seis funciones diferentes. Como nota común, pasas primero el patrón (la expresión a buscar) y como segundo argumento la cadena a comparar

ereg confronta la cadena con el patrón de búsqueda y devuelve TRUE o FALSE segun la encuentre.
eregi como la anterior, SIN distinguir entre mayusculas-minusculas

<?
ereg ("^am", "america"); // TRUE

$es_com = ereg("(\.)(com$)",$url);
// buscamos dos subpatrones en $url. El primero es
// un punto (literal) y por eso va escapado con la barra.
// el segundo subpatron también literal busca la secuencia "com"
// al final de una palabra.

?>


ereg_replace: Busca cualquier ocurrencia del patrón en la cadena y la reemplaza por otra.
eregi_replace: como la anterior pero sin distinguir mayusculas minusculas:

patrón, reemplazo, cadena a confrontar

<?
$cadena = ereg_replace ("^am", "hispano-am", "america"); // $cadena = hispano-america
?>


split() divide una cadena en piezas (que pasan a un array) usando expresiones regulares:
spliti: como el anterior, sin diferenciar Mayusculas-minusculas

Es básicamente igual que explode, pero utilizando expresiones regulares para dividir la cadena, en lugar de expresiones literales

<?
$date = "24-09-2003";
list($month, $day, $year) = split ('[/.-]', $date);

?>


Almacenando los resultados con ereg

Podemos pasar un patrón con subpatrones agrupados en parentesis. Si en este caso usamos ereg, podemos añadir un tercer parámetro: el nombre de un array que almacenará las ocurrencias; $array[1] contendrá la subcadena que empieza en el primer paréntesis izquierdo; $array[2] la que comienza en el segundo, etc. $array[0] contendrá una copia de la cadena.

<?
$date = "24-09-2003"; // pasamos una fecha formato dd-mm-yyyy

if (ereg ("([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})", $date, $mi_array)) {
   echo "$mi_array[3].$mi_array[2].$mi_array[1]"; // coincide. Lo mostramos en orden inverso porque somos asi : )
} else {
    echo "Invalid date format: $date"; // no coincide
}
?>


Almacenando los resultados con ereg_replace: backreferences

De forma muy similar a ereg, las funciones de búsqueda y sustitución ereg_replace y eregi_replace pueden almacenar y reutilizar subocurrencias (subpatrones encontrados en la cadena).

La principal diferencia es la forma de llamar las subocurrencias almacenadas, ya que necesitamos utilizar la barra invertida: \\0, \\1, \\2, y asi hasta un máximo de 9.

La primera referencia \\0 hace referencia a la coincidencia del patrón entero; el resto, a las sub-ocurrencias de los sub-patrones, de izquierda a derecha.

Por ejemplo vamos a usar esta capacidad para convertir una cadena que muestra una url en un enlace:

<?
$url = "la página blasten.com (http://www.blasten.com)";
$url = ereg_replace ("(http|ftp)://(www\.)?(.+)\.(com|net|org)","<a href=\"\\0 \">\\3</a>",$url);
echo $url; ?>

Autor

irv.

Compartir

Comentarios

matias

28/5/2007
y cuando se trate de url como http://www.desarrolloweb.com/articulos/comentario.php?id=2561
como hago para detallar lo que sigue despues del .com
es decir...
"/articulos/comentario.php?id=2561"
a traves de las expresiones regulares

?

Albert

17/1/2010
Esta malo
Estoy buscando alguna pero esto tampoco sirve, pés si colo 0009 como el año igual dice que es fecha valida. o como día coloco 88 igual dice valido....