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
[code lang=»PHP»]
<?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";
}
?>
[/code]
resultado
[code]
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.
[/code]
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
[code lang=»PHP»]
<?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";
}
?>
[/code]
Resultado:
[code]
La cadena 1234567 son sólo números.
La cadena abcdefg no son sólo números.
[/code]
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
[code lang=»PHP»]
$string = "[email protected]";
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";
}
[/code]
Direcciones IP
[code lang=»PHP»]
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);
}
[/code]
Fechas
Uno de los formatos de fechas típicos es el MM/DD/YYYY y su validación es la siguiente.
[code lang=»PHP»]
$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";
}
[/code]
Sacar la url de una etiqueta de enlace tipo Pedro Ventura Blog
[code lang=»PHP»]
preg_match(‘/^<a href="(.*)">(.*)<\/a>/’,’<a href="http://www.pedroventura.com">Pedro Ventura Blog</a>’,$resultados);
[/code]
Esto me devolverá lo siguiente:
[code]
Array
(
[0] => Array
(
[0] => <a href="http://www.pedroventura.com">Pedro Ventura Blog</a>
[1] => http://www.pedroventura.com
[2] => Pedro Ventura
)
)
[/code]
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.
[code lang=»PHP»]
$imagen_sin_style = preg_replace(‘@(<img[^>]*)style=(["|\’]).+?\\[email protected]’, ‘\\1’, $imagen);
[/code]
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í:
[code lang=»PHP»]
$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";
}
[/code]
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!!
Hola estoy tratando de buscar una cadena de texto en una pagina web pero no he podido realizar una expresion regular correcta para encotrarla. en el preg_mach le digo que me busque humedad y si lo encuentra pero necesito que me extraiga lo que tiene adelante del texto.
Gracias por la ayuda.
crero que no pego el codigo. este es el codigo de la busqueda.gracias.!!
Hola, quisera una ayuda en esto… Quiero capturar el codigo de video de youtube, sea cualquiera de estos casos:
https://www.youtube.com/watch?v=t-onMU8Xr-Q
https://www.youtube.com/watch?v=6BTjG-dhf5s&list=UU5cqeAzY9MJBiSuAtOlv6LQ&index=1
https://www.youtube.com/watch?v=LwaFtJHdrkM
Donde el codigo de todo lo que esta en v=….. y como hay algunos estan separados por guiones o al terminar el codigo sigue &list…..
Lo que necesito es solo capturar el codigo, gracias de antemano espero me puedan ayudar.