Diferencia entre revisiones de «Plantilla:PHP/ExpresionesRegulares»
(Página creada con «<div id=parrafo> ===Expresiones Regulares=== Una expresión regular consiste en establecer un patrón o conjunto de caracteres de manera general. De esta forma podremos com...») |
|||
| (24 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 1: | Línea 1: | ||
<div id=parrafo> | <div id=parrafo> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | === 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()'''. | ||
| + | |||
| + | ====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). También 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| | ||
| + | http://php.net/manual/es/regexp.reference.delimiters.php | ||
| + | }} | ||
| + | |||
| + | <source lang=php> | ||
| + | /una expresión/ // Carácter delimitador / | ||
| + | #^[^0-9]$# // Carácter delimitador # | ||
| + | +php+ // Carácter delimitador + | ||
| + | %[a-zA-Z0-9_-]% // Carácter delimitador % | ||
| + | </source> | ||
| + | |||
| + | ===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 más habituales. Tabla basada en el material de: | ||
http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html | http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | {| class="wikitable" | ||
| + | ! 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 | ||
| + | |- | ||
| + | |<nowiki>\</nowiki> | ||
| + | |carácter de '''escape''' para escribir caracteres especiales: | ||
| + | <nowiki>^ . [ ] % ( ) | * ? { } \</nowiki> | ||
| + | |- | ||
| + | |(cd) | ||
| + | |agrupación: los caracteres '''c''' y '''d''' juntos | ||
| + | |- | ||
| + | |c<nowiki>|</nowiki>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''' | ||
| + | |- | ||
| + | |<nowiki>[[:alnum:]]</nowiki> | ||
| + | |cualquier letra o dígito | ||
| + | |- | ||
| + | |<nowiki>[[:alpha:]]</nowiki> | ||
| + | |cualquier letra | ||
| + | |- | ||
| + | |<nowiki>[[:digit:]]</nowiki> | ||
| + | |cualquier dígito | ||
| + | |- | ||
| + | |<nowiki>[[:lower:]]</nowiki> | ||
| + | |cualquier letra minúscula | ||
| + | |- | ||
| + | |<nowiki>[[:punct:]]</nowiki> | ||
| + | |cualquier signo de puntuación | ||
| + | |- | ||
| + | |<nowiki>[[:space:]]</nowiki> | ||
| + | |cualquier espacio en blanco | ||
| + | |- | ||
| + | |<nowiki>[[:upper:]]</nowiki> | ||
| + | |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 | 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 (inicio y fin). | ||
| + | |||
| + | La expresión siguiente especifica una cadena que **contenga** uno o más números: | ||
| + | |||
| + | <source lang=php> | ||
| + | $exp = /[0-9]+/; | ||
| + | </source> | ||
| + | |||
| + | Ejemplos: | ||
| + | |||
| + | <source lang=php> | ||
| + | $cad1 = "asdfljoieka1asdf"; // Cumple: contiene un número | ||
| + | $cad2 = "1"; // Cumple | ||
| + | $cad3 = "134124"; // Cumple | ||
| + | $cad4 = "asdfasd4"; // Cumple | ||
| + | $cad5 = "asdfasd"; // No cumple | ||
| + | </source> | ||
| + | |||
| + | Si queremos que la cadena '''solo''' contenga números: | ||
| + | |||
| + | * debe '''empezar''' por un número → ^ | ||
| + | * debe '''terminar''' por un número → $ | ||
| + | |||
| + | <source lang=php> | ||
| + | $exp = /^[0-9]+$/; | ||
| + | </source> | ||
| + | |||
| + | En el ejemplo anterior, solo '''$cad3''' cumple esta expresión. | ||
| + | |||
| + | {{MRM_Recursos de la Web| | ||
| + | #https://regex101.com/ | ||
| + | #https://www.mclibre.org/consultar/php/lecciones/php-expresiones-regulares.html | ||
| + | #http://php.net/manual/es/book.pcre.php | ||
}} | }} | ||
| − | {{Plegable|hide|Validar expresiones Regulares| | + | {{MRM_Actividad|Title=Validar expresiones regulares| |
| + | *Realiza un programa que permita insertar una expresión regular y una cadena. | ||
| + | *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/ | ||
| + | }} | ||
| + | }} | ||
| + | |||
| + | {{Plegable|hide|Validar expresiones Regulares (Código)| | ||
<source lang=php> | <source lang=php> | ||
| + | <!DOCTYPE html> | ||
| + | <!-- Ejemplo de validación con expresiones regulares --> | ||
| + | <?php | ||
| + | if ($_POST['enviar']) { | ||
| + | $expresion = filter_input(INPUT_POST, "expresion"); | ||
| + | $cadena = filter_input(INPUT_POST, "cadena"); | ||
| + | if (preg_match("/$exp/", $cad)) | ||
| + | $msg = <<<FIN | ||
| + | <label><strong>$cadena</strong> | ||
| + | cumple la expresión <strong>$expresion</strong> | ||
| + | </label> | ||
| + | FIN; | ||
| + | else | ||
| + | $msg = <<<FIN | ||
| + | <label><strong>$cadena</strong> | ||
| + | NO cumple la expresión <strong>$expresion</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="<?= $expresion ??""; ?>"><br> | ||
| + | |||
| + | <label for="cadena">Cadena</label> | ||
| + | <input type="text" name="cadena" value="<?= $cadena ??"";><br> | ||
| + | |||
| + | <input type="submit" name="enviar" value="Enviar"> | ||
| + | <?php echo $msg; ?> | ||
| + | </form> | ||
| + | </fieldset> | ||
| + | </body> | ||
| + | </html> | ||
| + | </source> | ||
| + | |||
| + | {{Plegable|hide|Hoja de estilo| | ||
| + | <source lang=css> | ||
| + | fieldset{ | ||
| + | border: 0.25em solid; | ||
| + | position: absolute; | ||
| + | left: 20%; | ||
| + | top: 15%; | ||
| + | padding:10px; | ||
| + | background-color: #eee; | ||
| + | } | ||
| + | legend{ | ||
| + | font-size: 2em; | ||
| + | color: green; | ||
| + | font-weight: bold; | ||
| + | } | ||
| + | input[type=submit] { | ||
| + | padding:5px 15px 10px; | ||
| + | background:#ccc; | ||
| + | cursor:pointer; | ||
| + | border-radius: 5px; | ||
| + | margin: 1em; | ||
| + | font-size: 1.5em; | ||
| + | } | ||
| + | label{ | ||
| + | font-size: 1.5em; | ||
| + | margin: 0.65em; | ||
| + | } | ||
| + | input[type=text]{ | ||
| + | padding: 1em; | ||
| + | margin: 1em; | ||
| + | } | ||
| + | </source> | ||
| + | }} | ||
| + | }} | ||
| + | |||
| + | {{MRM_Actividad|Title=Practica con expresiones regulares| | ||
| + | ;Realiza una app que valide datos de entrada de un formulario | ||
| + | *La aplicación va a validar los siguientes ítems: | ||
| + | [[archivo:formulario_datos_personales.png]] | ||
| + | }} | ||
| − | |||
</div> | </div> | ||
Última revisión de 19:51 16 nov 2025
Contenido
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().
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). También 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 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 (inicio y fin).
La expresión siguiente especifica una cadena que **contenga** uno o más números:
$exp = /[0-9]+/;
Ejemplos:
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene un número $cad2 = "1"; // Cumple $cad3 = "134124"; // Cumple $cad4 = "asdfasd4"; // Cumple $cad5 = "asdfasd"; // No cumple
Si queremos que la cadena solo contenga números:
- debe empezar por un número → ^
- debe terminar por un número → $
$exp = /^[0-9]+$/;
En el ejemplo anterior, solo $cad3 cumple esta expresión.
|
| Validar expresiones Regulares (Código) | ||
|---|---|---|
<!DOCTYPE html> <!-- Ejemplo de validación con expresiones regulares --> <?php if ($_POST['enviar']) { $expresion = filter_input(INPUT_POST, "expresion"); $cadena = filter_input(INPUT_POST, "cadena"); if (preg_match("/$exp/", $cad)) $msg = <<<FIN <label><strong>$cadena</strong> cumple la expresión <strong>$expresion</strong> </label> FIN; else $msg = <<<FIN <label><strong>$cadena</strong> NO cumple la expresión <strong>$expresion</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="<?= $expresion ??""; ?>"><br> <label for="cadena">Cadena</label> <input type="text" name="cadena" value="<?= $cadena ??"";><br> <input type="submit" name="enviar" value="Enviar"> <?php echo $msg; ?> </form> </fieldset> </body> </html>
|
