expresiones regulares php
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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
1
2
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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:
1
2
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
1
2
3
4
5
6
$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
1
2
3
4
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])" ."(&amp;#92;.([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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$fecha= "16/02/2011";
$patron= "/[0-9]{2}&amp;#92;/[0-9]{2}&amp;#92;/[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 Pedro Ventura Blog
1
preg_match('/^<a href="(.*)">(.*)<&amp;#92;/a>/','<a href="http://www.pedroventura.com">Pedro Ventura Blog</a>',$resultados);
Esto me devolverá lo siguiente:
1
2
3
4
5
6
7
8
9
10
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.
1
$imagen_sin_style = preg_replace('@(<img[^>]*)style=(["|&amp;#92;']).+?&amp;#92;&amp;#92;2@si', '&amp;#92;&amp;#92;1', $imagen);