Plantilla:PHP/ExpresionesRegulares
- 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>
|
