expresiones regulares php
- julio 27, 2010
- 4 comentario/s
- PHP Tags: expresiones regulares, tutoriales
Las expresiones regulares permiten definir patrones de coincidencia y aplicarlas a cadenas de texto para saber si la cadena (o parte de ella) cumple el patrón e incluso realizar transformaciones de la cadena.
PHP permite dos tipos principales de funciones para expresiones regulares: las de tipo ereg (Expresiones regulares POSIX) y las de tipo preg (Compatibles con Perl). Son muy similares, aúnque las segundas llegan a ser algo más potentes.
Ejemplo de Expresiones regulares compatibles con Perl
<?php
$cadena1 = "1234567";
$cadena2 = "abcdefg";
$patron = "/^[[:digit:]]+$/";
if (preg_match($patron, $cadena1)) {
print "<p>La cadena $cadena1 son sólo números.</p>n";
} else {
print "<p>La cadena $cadena1 no son sólo números.</p>n";
}
if (preg_match($patron, $cadena2)) {
print "<p>La cadena $cadena2 son sólo números.</p>n";
} else {
print "<p>La cadena $cadena2 no son sólo números.</p>n";
}
?>
resultado
La cadena 1234567 son sólo números. La cadena abcdefg no son sólo números.
La función preg_match() distingue entre mayúsculas y minúsculas. Para que no distinga, debe añadirse el modificador “i” (sin comillas) al final del patrón. Este modificador no afecta las clases [[::]].
Patrones:
| Patrón | Significado |
|---|---|
| c | carácter c |
| . | cualquier carácter |
| ^c | empezar por el carácter c |
| c$ | terminar por el carácter c |
| c+ | 1 o más caracteres c |
| c* | 0 o más caracteres c |
| c? | 0 o 1 caracteres c |
| n | nueva línea |
| t | tabulador |
| \ | escape, para escribir delante de caracteres especiales: ^ . [ ] % ( ) | * ? { } \ |
| (cd) | caracteres c y d agrupados |
| c|d | carácter c o d |
| c{n} | n veces el carácter c |
| c{n,} | n o más caracteres c |
| c{n,m} | desde n hasta m caracteres c |
| [a-z] | cualquier letra minúscula |
| [A-Z] | cualquier letra mayúscula |
| [0-9] | cualquier dígito |
| [cde] | cualquiera de los caracteres c, d o e |
| [^c] | que no esté el carácter c |
| [[:alnum:]] | cualquier letra o dígito |
| [[:alpha:]] | cualquier letra |
| [[:digit:]] | cualquier dígito |
| [[:lower:]] | cualquier letra minúscula |
| [[:punct:]] | cualquier marca de puntuación |
| [[:space:]] | cualquier espacio en blanco |
| [[:upper:]] | cualquier letra mayúscula |
Ejemplo de Expresiones regulares POSIX
<?php
$cadena1 = "1234567";
$cadena2 = "abcdefg";
$patron = "^[[:digit:]]+$";
if (eregi($patron, $cadena1)) {
print "<p>La cadena $cadena1 son sólo números.</p>n";
} else {
print "<p>La cadena $cadena1 no son sólo números.</p>n";
}
if (eregi($patron, $cadena2)) {
print "<p>La cadena $cadena2 son sólo números.</p>n";
} else {
print "<p>La cadena $cadena2 no son sólo números.</p>n";
}
?>
Resultado:
La cadena 1234567 son sólo números. La cadena abcdefg no son sólo números.
Funciones tipo POSIX
- ereg(). Devuelve true si se cumple el patrón, o false si no se cumple.
- eregi(). Igual que ereg(), pero sin distinguir mayúsculas y minúsculas
- ereg_replace(). Usando la potencia de las expresiones regulares, permite modificar una cadena de texto.
- eregi_replace(). Igual que la anterior, sin distinguir minúsculas y mayúsculas.
- split(). Divide una cadena en un array, según un patrón REGEX. Hace la misma tarea que la función explode, pero indicando una expresión regular como separador.
- spliti(). Igual que el anterior, sin diferenciar minúscula y mayúscula.
Para tratar cadenas en UTF8 hay que usar las funciones mb_xxx por ejemplo en este caso mb_ereg(), etc..
Funciones tipo PCRE
- preg_match(). Chequea el patrón en una cadena alfanumérica. Devuelve true si coincide, o false en caso contrario. Además captura las coincidencias en un array.
- preg_match_all(). Igual que preg_match, pero almacenando todas las subcadenas que coincidan con el patrón (no sólo una como es el caso de preg_match)
- preg_replace(). Nos permite reemplazar textos mediante expresiones regulares. Los argumentos pueden ser arrays, con lo que se realiza más de una sustitución con una sola función.
- preg_split(). Separa la cadena dada mediante una expresión regular.
- preg_grep(). Busca el patrón dentro de un array, y devuelve otro array con las ocurrencias.
Ejemplos prácticos:
NOTA: por problemas a la hora de mostrar las barras de escape: \, he tenido que poner el codigo html de la barra que es este (sin espacios): & # 9 2 ; De manera que cuando se usen estas expresiones regulares remplazar el codigo & # 9 2 ; por la barra de escape: \
Direcciones de Email
$string = "pepito.perez@domain.co.uk";
if (preg_match(
'/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',
$string)) {
echo "ok";
}
Direcciones IP
function ip_valida($ip)
{
return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" ."(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}
Fechas
Uno de los formatos de fechas típicos es el MM/DD/YYYY y su validación es la siguiente.
$fecha= "16/02/2011";
$patron= "/[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/";
if (preg_match($patron, $fecha))
{
echo "fecha ok";
}
else
{
echo "fecha no válida";
}
$fecha= "16-02-2011";
$patron= "/[0-9]{2}-[0-9]{2}-[0-9]{4}$/";
if (preg_match($patron, $fecha))
{
echo "fecha ok";
}
else
{
echo "fecha no válida";
}
Sacar la url de una etiqueta de enlace tipo <a href=”http://www.pedroventura.com”>Pedro Ventura Blog</a>
preg_match('/^<a href="(.*)">(.*)<\/a>/','<a href="http://www.pedroventura.com">Pedro Ventura Blog</a>',$resultados);
Esto me devolverá lo siguiente:
Array
(
[0] => Array
(
[0] => <a href="http://www.pedroventura.com">Pedro Ventura Blog</a>
[1] => http://www.pedroventura.com
[2] => Pedro Ventura
)
)
El primer resultado $resultados[0] contendrá el texto que coincide con el patrón completo.
$resultados[1] contendrá el texto que se ha encontrado de la primera captura indicado en el patrón, con la expresión regular, y así sucesivamente.
Expresión regular para reemplazar todo lo que haya en el atributo style de una imagen, el style inclusive. En este caso lo reemplaza por un espacio.
$imagen_sin_style = preg_replace('@(<img[^>]*)style=(["|\']).+?\\2@si', '\\1', $imagen);
Tags de búsquedas:
expresiones regulares php, expresion regular en php para solo letras, superponer dos funciones jquery, prueba expresiones regulares php, preg_match un solo array, preg_match php numeros y letras, preg_match espacios, php quitar caracteres especiales fichero subido, php expresiones regulares, php expresion regular fecha y horas
Posts Relacionados:
- Expresiones regulares y uso del enrutador routes.php de CakePHP Después de algo mas de un año trabajando con CakePHP todavía estoy aprendiendo y mejorando una de las “piedras angulares” del framework CakePHP y es a usar y manejar el...
- expresiones regulares para parsear un RSS o XML En este post voy a explicar como eliminar un contenido determinado ya sea una imagen o una etiqueta HTML, que no queremos que salga cuando parseamos el RSS o XML...
- Expresiones regulares en javacript. Teoría y ejemplos El siguiente artículo es una adaptación de uno de los capítulos de expresiones regulares del libro de O’reilly Javascript Cookbook. Por lo que algunos nombres, y ejemplos de frases los...
- Como usar grep. Comando de búsqueda linux El comando grep es muy útil. busca los ficheros que contienen la cadena especificada y devuelve el nombre del fichero y (si se trata de un fichero de texto) una...
- funcion en php para limpiar cadenas de texto en utf8 A continuación indico una simple función que he desarrollado y el uso básico que le estoy dando es para limpiar las cadenas de esto de html, carácteres htmlentities, tabulaciones, espacios...

Te ha ayudado el artículo? Colabora!
RSS Feed
Esta no va.
preg_match(‘/^(.*)/’,’Pedro Ventura Blog‘,$resultados);
Deveria se asi
preg_match(‘/(.*?)/’,’Pedro Ventura Blog‘,$resultados);
Lo probaré. Si es como tu dices muchas gracias por el comentario!!
En esa expresión regular de fecha que tienes, ¿por qué no pruebas a validar el 29-29-2001? Dice que es una fecha válida
Échale uno ojo ahora! es que había algunos errores en la expresión regular.
La he dejado así:
$fecha= "16/02/2011"; $patron="/^(\d){2}\/(\d){2}\/(\d){4}$/i"; if (preg_match($patron, $fecha)) { echo "fecha ok"; } else { echo "fecha no válida"; }