Diferencia entre revisiones de «Plantilla:PHP/ExpresionesRegulares»
(→Coincidencia exacta o solo qué contenga) |
(→Expresiones Regulares (er)) |
||
| Línea 1: | Línea 1: | ||
<div id=parrafo> | <div id=parrafo> | ||
| − | + | # Expresiones Regulares (ER) | |
| − | Una expresión regular | + | |
| − | + | Una **expresión regular** es un **patrón de búsqueda** formado por un conjunto de caracteres que siguen unas reglas. Sirve para comprobar si una cadena de texto **cumple** o **no cumple** ese patrón. | |
| − | + | ||
| − | Antes de | + | Las expresiones regulares son muy útiles para validar datos como **teléfonos**, **emails**, **URLs**, **códigos postales**, etc. |
| + | |||
| + | Podemos usar una expresión regular para dos tipos de comprobación: | ||
| + | |||
| + | 1. **Coincidencia exacta**: la cadena debe ajustarse completamente al patrón. | ||
| + | 2. **Coincidencia parcial**: la cadena solo debe **contener** el patrón en alguna parte. | ||
| + | |||
| + | Antes de ver ejemplos, es necesario saber cómo se escribe una expresión regular en PHP y cómo se utiliza con funciones como **preg_match()**, **preg_replace()** o **preg_split()**. | ||
====Delimitadores==== | ====Delimitadores==== | ||
| − | * | + | |
| + | *Una expresión regular en PHP debe estar rodeada por un **carácter delimitador**, que marca el inicio y el final del patrón. Este carácter es **de elección libre**, siempre que no entre en conflicto con el contenido del propio patrón.* | ||
| + | |||
| + | *El delimitador es imprescindible porque PHP necesita una forma inequívoca de saber que el primer parámetro de funciones como **preg_match()**, **preg_replace()** o **preg_split()** es una **expresión regular** y no una cadena, un número o una constante. Si no hubiera delimitadores, PHP no podría distinguir el patrón del resto del código.* | ||
| + | |||
| + | *Además, los delimitadores permiten añadir **modificadores** al final del patrón (como `i` para mayúsculas/minúsculas o `m` para modo multilínea), algo que sería imposible sin esta marca de inicio y fin. Por último, es habitual elegir un delimitador que no aparezca dentro del propio patrón para evitar tener que escaparlo.* | ||
| + | |||
{{MRM_Recursos de la Web|Title=Delimitadores| | {{MRM_Recursos de la Web|Title=Delimitadores| | ||
http://php.net/manual/es/regexp.reference.delimiters.php | http://php.net/manual/es/regexp.reference.delimiters.php | ||
}} | }} | ||
| + | |||
<source lang=php> | <source lang=php> | ||
| − | /una expresión/ | + | /una expresión/ // Carácter delimitador / |
| − | #^[^0-9]$# | + | #^[^0-9]$# // Carácter delimitador # |
| − | +php+ | + | +php+ // Carácter delimitador + |
| − | %[a-zA-Z0-9_-]% | + | %[a-zA-Z0-9_-]% // Carácter delimitador % |
</source> | </source> | ||
| − | + | ===Expresando la expresión regular==== | |
| − | *Para | + | |
| − | * | + | *Para escribir una expresión regular podemos usar caracteres literales (tal cual) o bien emplear **metacaracteres**, rangos y agrupamientos que permiten definir patrones más complejos.* |
| + | |||
| + | *En la siguiente tabla se resumen los metacaracteres y construcciones más habituales. Tabla basada en el material de: | ||
| + | http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html* | ||
| + | |||
<br /> | <br /> | ||
| − | {| | + | |
| − | + | {| class="wikitable" | |
| − | + | ! Patrón | |
| + | ! Significado | ||
|- | |- | ||
|c | |c | ||
| − | |carácter c | + | |carácter literal **c** |
|- | |- | ||
|. | |. | ||
| − | |cualquier carácter | + | |cualquier carácter |
|- | |- | ||
|^c | |^c | ||
| − | | empezar por el carácter c | + | |la cadena debe **empezar** por el carácter **c** |
|- | |- | ||
| − | |c$ | + | |c$ |
| − | |terminar por el carácter c | + | |la cadena debe **terminar** por el carácter **c** |
|- | |- | ||
| − | |c+ | + | |c+ |
| − | | | + | |uno o más caracteres **c** |
|- | |- | ||
| − | |c* | + | |c* |
| − | | | + | |cero o más caracteres **c** |
|- | |- | ||
|c? | |c? | ||
| − | | | + | |cero o un carácter **c** |
|- | |- | ||
| − | |\n | + | |\n |
|nueva línea | |nueva línea | ||
|- | |- | ||
| Línea 53: | Línea 72: | ||
|tabulador | |tabulador | ||
|- | |- | ||
| − | |<nowiki>\</nowiki> | + | |<nowiki>\</nowiki> |
| − | |escape | + | |carácter de **escape** para escribir caracteres especiales: |
| + | <nowiki>^ . [ ] % ( ) | * ? { } \</nowiki> | ||
|- | |- | ||
| − | |(cd) | + | |(cd) |
| − | |caracteres c y d | + | |agrupación: los caracteres **c** y **d** juntos |
|- | |- | ||
| − | |c<nowiki>|</nowiki>d | + | |c<nowiki>|</nowiki>d |
| − | |carácter c o d | + | |carácter **c** o carácter **d** |
|- | |- | ||
| − | |c{n} | + | |c{n} |
| − | |n | + | |exactamente **n** repeticiones del carácter **c** |
|- | |- | ||
| − | |c{n,} | + | |c{n,} |
| − | |n o más | + | |**n o más** repeticiones del carácter **c** |
|- | |- | ||
| − | |c{n,m} | + | |c{n,m} |
| − | | | + | |entre **n y m** repeticiones del carácter **c** |
|- | |- | ||
| − | |[a-z] | + | |[a-z] |
|cualquier letra minúscula | |cualquier letra minúscula | ||
|- | |- | ||
| − | |[A-Z] | + | |[A-Z] |
|cualquier letra mayúscula | |cualquier letra mayúscula | ||
|- | |- | ||
| − | |[0-9] | + | |[0-9] |
|cualquier dígito | |cualquier dígito | ||
|- | |- | ||
| − | |[cde] | + | |[cde] |
| − | |cualquiera de los caracteres c, d o e | + | |cualquiera de los caracteres **c**, **d** o **e** |
|- | |- | ||
| − | |[c-f] | + | |[c-f] |
| − | |cualquier letra entre c y f ( | + | |cualquier letra entre **c** y **f** (c, d, e o f) |
|- | |- | ||
| − | |[^c] | + | |[^c] |
| − | |que no | + | |cualquier carácter que **no** sea **c** |
|- | |- | ||
| − | |<nowiki>[[:alnum:]]</nowiki> | + | |<nowiki>[[:alnum:]]</nowiki> |
|cualquier letra o dígito | |cualquier letra o dígito | ||
|- | |- | ||
| − | |<nowiki>[[:alpha:]]</nowiki> | + | |<nowiki>[[:alpha:]]</nowiki> |
|cualquier letra | |cualquier letra | ||
|- | |- | ||
| − | |<nowiki>[[:digit:]]</nowiki> | + | |<nowiki>[[:digit:]]</nowiki> |
|cualquier dígito | |cualquier dígito | ||
|- | |- | ||
| − | |<nowiki>[[:lower:]]</nowiki> | + | |<nowiki>[[:lower:]]</nowiki> |
|cualquier letra minúscula | |cualquier letra minúscula | ||
|- | |- | ||
| − | |<nowiki>[[:punct:]]</nowiki> | + | |<nowiki>[[:punct:]]</nowiki> |
| − | |cualquier | + | |cualquier signo de puntuación |
|- | |- | ||
| − | |<nowiki>[[:space:]]</nowiki> | + | |<nowiki>[[:space:]]</nowiki> |
|cualquier espacio en blanco | |cualquier espacio en blanco | ||
|- | |- | ||
| Línea 110: | Línea 130: | ||
|cualquier letra mayúscula | |cualquier letra mayúscula | ||
|} | |} | ||
| − | ====Expresiones regulares en | + | ====Expresiones regulares en PHP==== |
| − | + | ||
| − | http://php.net/manual/es/book.pcre.php | + | Son varias las funciones relacionadas con expresiones regulares en PHP: |
| − | + | http://php.net/manual/es/book.pcre.php | |
| − | * | + | |
| − | http://php.net/manual/es/function.preg-match.php | + | *La función más utilizada es* **preg_match($expresion, $cadena)**, *que permite comprobar si una cadena cumple (o no) una expresión regular.* |
| − | ====Coincidencia exacta o solo | + | http://php.net/manual/es/function.preg-match.php |
| − | Es muy importante | + | |
| − | Para | + | ====Coincidencia exacta o solo que contenga==== |
| − | + | ||
| + | Es muy importante distinguir entre: | ||
| + | |||
| + | * **Coincidencia parcial:** la cadena *contiene* el patrón en algún punto. | ||
| + | * **Coincidencia exacta:** la cadena debe **coincidir por completo** con el patrón (de principio a fin). | ||
| + | |||
| + | Para entender esta diferencia, veamos el siguiente ejemplo: | ||
| + | |||
| + | La expresión regular siguiente especifica una cadena que **contenga** uno o más números: | ||
| + | |||
<source lang=php> | <source lang=php> | ||
| − | $exp = /[0-9]+/ | + | $exp = /[0-9]+/; |
</source> | </source> | ||
| − | + | Analicemos algunas cadenas: | |
| + | |||
<source lang=php> | <source lang=php> | ||
| − | $cad1 = "asdfljoieka1asdf"; // | + | $cad1 = "asdfljoieka1asdf"; // Cumple: contiene el número 1 |
| − | $cad2 = "1"; //Cumple | + | $cad2 = "1"; // Cumple |
| − | $cad3 = "134124"; //Cumple | + | $cad3 = "134124"; // Cumple |
| − | $cad4 = " | + | $cad4 = "asdfasd4"; // Cumple: contiene el número 4 |
| − | $cad5 = "asdfasd"; //No | + | $cad5 = "asdfasd"; // No cumple: no tiene ningún número |
</source> | </source> | ||
| − | Sin embargo si | + | |
| + | Sin embargo, si queremos especificar que la cadena **solo** contenga números, entonces debemos indicar que: | ||
| + | |||
| + | * la cadena **empiece** por un número → `^` | ||
| + | * la cadena **termine** por un número → `$` | ||
| + | |||
| + | Por ejemplo: | ||
| + | |||
<source lang=php> | <source lang=php> | ||
| − | $exp = /^[0-9]+$/ | + | $exp = /^[0-9]+$/; |
</source> | </source> | ||
| − | |||
| − | {{MRM_Recursos de la Web| | + | En este caso, solo la cadena **$cad3** cumple la expresión, ya que es la única formada únicamente por números. |
| − | #https://regex101.com/ (Para practicar | + | |
| + | {{MRM_Recursos de la Web| | ||
| + | #https://regex101.com/ (Para practicar) | ||
#https://www.mclibre.org/consultar/php/lecciones/php-expresiones-regulares.html | #https://www.mclibre.org/consultar/php/lecciones/php-expresiones-regulares.html | ||
#http://php.net/manual/es/book.pcre.php | #http://php.net/manual/es/book.pcre.php | ||
}} | }} | ||
| + | |||
{{MRM_Actividad|Title=Validar expresiones regulares| | {{MRM_Actividad|Title=Validar expresiones regulares| | ||
| − | *Realiza un programa que permita insertar una expresión regular y una cadena | + | *Realiza un programa que permita insertar una expresión regular y una cadena. |
| − | *Posteriormente | + | *Posteriormente debe validarse si la cadena cumple o no la expresión regular. |
| − | + | ||
| − | + | ||
| − | + | ||
| + | {{MRM_Recursos de la Web|Title=Ver el ejercicio funcionando| | ||
| + | http://manuel.infenlaces.com/dwes/Expresiones_Regulares/ | ||
| + | }} | ||
}} | }} | ||
| Línea 156: | Línea 195: | ||
<!DOCTYPE html> | <!DOCTYPE html> | ||
<!-- | <!-- | ||
| − | + | Ejemplo de validación con expresiones regulares. | |
| − | + | --> | |
| − | + | ||
<?php | <?php | ||
if ($_POST['enviar']) { | if ($_POST['enviar']) { | ||
| Línea 166: | Línea 204: | ||
$msg = <<<FIN | $msg = <<<FIN | ||
<label><strong>$cad</strong> | <label><strong>$cad</strong> | ||
| − | + | cumple la expresión <strong>$exp</strong> | |
</label> | </label> | ||
FIN; | FIN; | ||
| Línea 172: | Línea 210: | ||
$msg = <<<FIN | $msg = <<<FIN | ||
<label><strong>$cad</strong> | <label><strong>$cad</strong> | ||
| − | NO | + | NO cumple la expresión <strong>$exp</strong> |
</label> | </label> | ||
FIN; | FIN; | ||
| − | |||
} | } | ||
| − | ? | + | ?> |
<html> | <html> | ||
<head> | <head> | ||
| Línea 185: | Línea 222: | ||
</head> | </head> | ||
<body> | <body> | ||
| − | |||
| − | |||
<fieldset> | <fieldset> | ||
<legend>Validar expresiones regulares</legend> | <legend>Validar expresiones regulares</legend> | ||
<form action="." method="POST"> | <form action="." method="POST"> | ||
| − | |||
<label for="expresion">Expresión</label> | <label for="expresion">Expresión</label> | ||
| − | <input type="text" name="expresion" value= "<?= $exp; ?>" | + | <input type="text" name="expresion" value="<?= $exp; ?>"><br> |
| + | |||
<label for="cadena">Cadena</label> | <label for="cadena">Cadena</label> | ||
<input type="text" name="cadena"><br> | <input type="text" name="cadena"><br> | ||
| + | |||
<input type="submit" name="enviar" value="Enviar"> | <input type="submit" name="enviar" value="Enviar"> | ||
<?php echo $msg; ?> | <?php echo $msg; ?> | ||
| Línea 202: | Línea 238: | ||
</html> | </html> | ||
</source> | </source> | ||
| + | |||
{{Plegable|hide|Hoja de estilo| | {{Plegable|hide|Hoja de estilo| | ||
<source lang=css> | <source lang=css> | ||
| − | |||
fieldset{ | fieldset{ | ||
border: 0.25em solid; | border: 0.25em solid; | ||
| Línea 229: | Línea 265: | ||
} | } | ||
label{ | label{ | ||
| − | font-size : 1.5em; | + | font-size: 1.5em; |
margin: 0.65em; | margin: 0.65em; | ||
| − | |||
} | } | ||
input[type=text]{ | input[type=text]{ | ||
| − | padding: | + | padding: 1em; |
| − | margin: | + | margin: 1em; |
} | } | ||
| − | |||
</source> | </source> | ||
| − | |||
| − | |||
}} | }} | ||
}} | }} | ||
Revisión de 19:44 16 nov 2025
- Expresiones Regulares (ER)
Una **expresión regular** es un **patrón de búsqueda** formado por un conjunto de caracteres que siguen unas reglas. Sirve para comprobar si una cadena de texto **cumple** o **no cumple** ese patrón.
Las expresiones regulares son muy útiles para validar datos como **teléfonos**, **emails**, **URLs**, **códigos postales**, etc.
Podemos usar una expresión regular para dos tipos de comprobación:
1. **Coincidencia exacta**: la cadena debe ajustarse completamente al patrón. 2. **Coincidencia parcial**: la cadena solo debe **contener** el patrón en alguna parte.
Antes de ver ejemplos, es necesario saber cómo se escribe una expresión regular en PHP y cómo se utiliza con funciones como **preg_match()**, **preg_replace()** o **preg_split()**.
Contenido
Delimitadores
- Una expresión regular en PHP debe estar rodeada por un **carácter delimitador**, que marca el inicio y el final del patrón. Este carácter es **de elección libre**, siempre que no entre en conflicto con el contenido del propio patrón.*
- El delimitador es imprescindible porque PHP necesita una forma inequívoca de saber que el primer parámetro de funciones como **preg_match()**, **preg_replace()** o **preg_split()** es una **expresión regular** y no una cadena, un número o una constante. Si no hubiera delimitadores, PHP no podría distinguir el patrón del resto del código.*
- Además, los delimitadores permiten añadir **modificadores** al final del patrón (como `i` para mayúsculas/minúsculas o `m` para modo multilínea), algo que sería imposible sin esta marca de inicio y fin. Por último, es habitual elegir un delimitador que no aparezca dentro del propio patrón para evitar tener que escaparlo.*
/una expresión/ // Carácter delimitador / #^[^0-9]$# // Carácter delimitador # +php+ // Carácter delimitador + %[a-zA-Z0-9_-]% // Carácter delimitador %
Expresando la expresión regular=
- Para escribir una expresión regular podemos usar caracteres literales (tal cual) o bien emplear **metacaracteres**, rangos y agrupamientos que permiten definir patrones más complejos.*
- En la siguiente tabla se resumen los metacaracteres y construcciones más habituales. Tabla basada en el material de:
http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html*
| Patrón | Significado |
|---|---|
| c | carácter literal **c** |
| . | cualquier carácter |
| ^c | la cadena debe **empezar** por el carácter **c** |
| c$ | la cadena debe **terminar** por el carácter **c** |
| c+ | uno o más caracteres **c** |
| c* | cero o más caracteres **c** |
| c? | cero o un carácter **c** |
| \n | nueva línea |
| \t | tabulador |
| \ | carácter de **escape** para escribir caracteres especiales:
^ . [ ] % ( ) | * ? { } \ |
| (cd) | agrupación: los caracteres **c** y **d** juntos |
| c|d | carácter **c** o carácter **d** |
| c{n} | exactamente **n** repeticiones del carácter **c** |
| c{n,} | **n o más** repeticiones del carácter **c** |
| c{n,m} | entre **n y m** repeticiones del carácter **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-f] | cualquier letra entre **c** y **f** (c, d, e o f) |
| [^c] | cualquier carácter que **no** sea **c** |
| [[:alnum:]] | cualquier letra o dígito |
| [[:alpha:]] | cualquier letra |
| [[:digit:]] | cualquier dígito |
| [[:lower:]] | cualquier letra minúscula |
| [[:punct:]] | cualquier signo de puntuación |
| [[:space:]] | cualquier espacio en blanco |
| [[:upper:]] | cualquier letra mayúscula |
Expresiones regulares en PHP
Son varias las funciones relacionadas con expresiones regulares en PHP: http://php.net/manual/es/book.pcre.php
- La función más utilizada es* **preg_match($expresion, $cadena)**, *que permite comprobar si una cadena cumple (o no) una expresión regular.*
http://php.net/manual/es/function.preg-match.php
Coincidencia exacta o solo que contenga
Es muy importante distinguir entre:
- **Coincidencia parcial:** la cadena *contiene* el patrón en algún punto.
- **Coincidencia exacta:** la cadena debe **coincidir por completo** con el patrón (de principio a fin).
Para entender esta diferencia, veamos el siguiente ejemplo:
La expresión regular siguiente especifica una cadena que **contenga** uno o más números:
$exp = /[0-9]+/;
Analicemos algunas cadenas:
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene el número 1 $cad2 = "1"; // Cumple $cad3 = "134124"; // Cumple $cad4 = "asdfasd4"; // Cumple: contiene el número 4 $cad5 = "asdfasd"; // No cumple: no tiene ningún número
Sin embargo, si queremos especificar que la cadena **solo** contenga números, entonces debemos indicar que:
- la cadena **empiece** por un número → `^`
- la cadena **termine** por un número → `$`
Por ejemplo:
$exp = /^[0-9]+$/;
En este caso, solo la cadena **$cad3** cumple la expresión, ya que es la única formada únicamente por números.
|
| Validar expresiones Regulares (Código) | ||
|---|---|---|
<!DOCTYPE html> <!-- Ejemplo de validación con expresiones regulares. --> <?php if ($_POST['enviar']) { $exp = filter_input(INPUT_POST, "expresion"); $cad = filter_input(INPUT_POST, "cadena"); if (preg_match("/$exp/", $cad)) $msg = <<<FIN <label><strong>$cad</strong> cumple la expresión <strong>$exp</strong> </label> FIN; else $msg = <<<FIN <label><strong>$cad</strong> NO cumple la expresión <strong>$exp</strong> </label> FIN; } ?> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="estilo.css" media="screen" /> </head> <body> <fieldset> <legend>Validar expresiones regulares</legend> <form action="." method="POST"> <label for="expresion">Expresión</label> <input type="text" name="expresion" value="<?= $exp; ?>"><br> <label for="cadena">Cadena</label> <input type="text" name="cadena"><br> <input type="submit" name="enviar" value="Enviar"> <?php echo $msg; ?> </form> </fieldset> </body> </html>
|
