Diferencia entre revisiones de «Plantilla:PHP/ExpresionesRegulares»

De WikiEducator
Saltar a: navegación, buscar
(Coincidencia exacta o solo qué contenga)
(Expresiones Regulares (er))
Línea 1: Línea 1:
 
<div id=parrafo>
 
<div id=parrafo>
===Expresiones Regulares (er)===
+
# Expresiones Regulares (ER)
Una expresión regular consiste en establecer un patrón o conjunto de caracteres de manera general. De esta forma podremos comprobar si una determinada expresión compuesta por una serie de caracteres concretos, cumple o no la expresión regular<br />
+
 
Esta es una técnica extremadamente útil para verificar cualquier tipo de cadena de caracteres, por ejemplo teléfono, email, url, etc.<br />
+
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.
Es importante tener claro que una expresión regular la podemos utilizar para ver si una cadena coincide exactamente con el patrón, o solo lo continene (En este caso podría ser que empezara por una expresión o que terminara por ella, o que estuviera dentro de ella).<br />
+
 
Antes de poder ver algún ejemplo, necesitamos saber cómo se expresa una er en php.
+
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====
*A la hora de expresar una expresión regular debemos de hacerlo usando un carácter delimitador al comienzo y final; Este carácter es de elección libre
+
 
 +
*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/   //Carácter delimitador /
+
/una expresión/     // Carácter delimitador /
#^[^0-9]$#       //Carácter delimitador #
+
#^[^0-9]$#           // Carácter delimitador #
+php+             //Carácter delimitador +
+
+php+               // Carácter delimitador +
%[a-zA-Z0-9_-]%   //Carácter delimitador %
+
%[a-zA-Z0-9_-]%     // Carácter delimitador %
 
</source>
 
</source>
  
====Expresando la expresión regular====
+
===Expresando la expresión regular====
*Para especificar las expresiones regulares se puede especificar el carácter tal cual, o usar metacaracteres y agrupamiento de caracteres
+
 
*Ver la siguiente tabla sacada de la dirección http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html
+
*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 />
{| align="center" border="1" style=color:red"|-
+
 
|Patrón  
+
{| class="wikitable"
|Significado
+
! 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+
|1 o más caracteres c
+
|uno o más caracteres **c**
 
|-
 
|-
|c*
+
|c*
|0 o más caracteres c
+
|cero o más caracteres **c**
 
|-
 
|-
 
|c?
 
|c?
|0 o 1 caracteres 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, para escribir delante de caracteres especiales: <nowiki>^ . [ ] % ( ) | * ? { } \</nowiki>
+
|carácter de **escape** para escribir caracteres especiales:
 +
<nowiki>^ . [ ] % ( ) | * ? { } \</nowiki>
 
|-
 
|-
|(cd)
+
|(cd)
|caracteres c y d agrupados
+
|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 veces el carácter c
+
|exactamente **n** repeticiones del carácter **c**
 
|-
 
|-
|c{n,}
+
|c{n,}
|n o más caracteres c
+
|**n o más** repeticiones del carácter **c**
 
|-
 
|-
|c{n,m}
+
|c{n,m}
|desde n hasta m caracteres c
+
|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 (es decir, c, d, e o f)
+
|cualquier letra entre **c** y **f** (c, d, e o f)
 
|-
 
|-
|[^c]
+
|[^c]
|que no esté el carácter c
+
|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 marca de puntuación
+
|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 php====
+
====Expresiones regulares en PHP====
Ŝon varias las funciones relacionadas con expresiones regulares en php
+
 
  http://php.net/manual/es/book.pcre.php
+
Son varias las funciones relacionadas con expresiones regulares en PHP:  
<br/>
+
http://php.net/manual/es/book.pcre.php
*Usaremos la función '''''preg_match($expresion, $cadena)''''' para comprobar que una cadena cumple una determinada expresión regular
+
 
  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 qué contenga====
+
http://php.net/manual/es/function.preg-match.php
Es muy importante diferenciar entre que una cadena coincida exactamente con una expresión regular, y que una cadena cumpla una determinada expresión regular.<br />
+
 
Para aclarar este concepto vamos a ver el siguiente ejemplo:  
+
====Coincidencia exacta o solo que contenga====
La siguiente expresión regular establece una cadena que contenga 1 o más números.
+
 
 +
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>
  
*Observamos las siguientes cadenas
+
Analicemos algunas cadenas:
 +
 
 
<source lang=php>
 
<source lang=php>
$cad1 = "asdfljoieka1asdf"; //No Cumple la expresión $exp porque no tiene ningún número
+
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene el número 1
$cad2 = "1"; //Cumple por que tiene un número
+
$cad2 = "1";               // Cumple
$cad3 = "134124"; //Cumple por que tiene un número
+
$cad3 = "134124";         // Cumple
$cad4 = "asdfasdf4"; //Cumple por que tiene un número
+
$cad4 = "asdfasd4";       // Cumple: contiene el número 4
$cad5 = "asdfasd"; //No Cumple por que no tiene un número
+
$cad5 = "asdfasd";         // No cumple: no tiene ningún número
 
</source>
 
</source>
Sin embargo si se quiere especificar, que la cadena sólo contenga números, una forma de especificarlo (por supuesto hay más), estableceremos que comience y termine por números (signo<strong> ^</strong> para el comienzo y <strong>$</strong> para la terminación).
+
 
 +
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>
De esta forma, en los ejemplos anteriores, solo la cadena almacenada en la variable $cad3, cumple la expresión regular.
 
  
{{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, propuesta de un compañero de clase.
+
 
 +
{{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 hacemos que valide a ver si la cadena cumple o no la expresión regular
+
*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/
+
}}
+
  
 +
{{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>
 
<!--
 
<!--
To change this license header, choose License Headers in Project Properties.
+
Ejemplo de validación con expresiones regulares.
To change this template file, choose Tools | Templates
+
-->
and open the template in the editor.
+
 
<?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>
             es de la expresión <strong>$exp</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 es de la expresión <strong>$exp</strong>
+
             NO cumple la expresión <strong>$exp</strong>
 
             </label>
 
             </label>
 
FIN;
 
FIN;
    // put your code here
 
 
}
 
}
?>-->
+
?>
 
<html>
 
<html>
 
     <head>
 
     <head>
Línea 185: Línea 222:
 
     </head>
 
     </head>
 
     <body>
 
     <body>
        <?php
 
        ?>
 
 
         <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; ?>" ><br>
+
                 <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: 1em 1em 1em 1em;
+
     padding: 1em;
     margin: 1em 1em 1em 1em;
+
     margin: 1em;
 
}
 
}
 
 
</source>
 
</source>
 
 
 
}}
 
}}
 
}}
 
}}

Revisión de 19:44 16 nov 2025

  1. 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), 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.






Icon activity.jpg
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.








Icon activity.jpg
Practica con expresiones regulares
Realiza una app que valide datos de entrada de un formulario
  • La aplicación va a validar los siguientes items

Formulario datos personales.png