Diferencia entre revisiones de «Plantilla:PHP/ExpresionesRegulares»

De WikiEducator
Saltar a: navegación, buscar
(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** 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.
+
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.
+
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:
 
Podemos usar una expresión regular para dos tipos de comprobación:
  
1. **Coincidencia exacta**: la cadena debe ajustarse completamente al patró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.
+
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()**.
+
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.*
+
''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.*
+
''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.*
+
''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|
 
{{MRM_Recursos de la Web|Title=Delimitadores|
Línea 34: Línea 35:
 
===Expresando la expresión regular====
 
===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.*
+
''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:   
+
''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 />
 
<br />
Línea 46: Línea 47:
 
|-
 
|-
 
|c
 
|c
|carácter literal **c**
+
|carácter literal '''c'''
 
|-
 
|-
 
|.
 
|.
Línea 52: Línea 53:
 
|-
 
|-
 
|^c
 
|^c
|la cadena debe **empezar** por el carácter **c**
+
|la cadena debe '''empezar''' por el carácter '''c'''
 
|-
 
|-
 
|c$
 
|c$
|la cadena debe **terminar** por el carácter **c**
+
|la cadena debe '''terminar''' por el carácter '''c'''
 
|-
 
|-
 
|c+
 
|c+
|uno o más caracteres **c**
+
|uno o más caracteres '''c'''
 
|-
 
|-
 
|c*
 
|c*
|cero o más caracteres **c**
+
|cero o más caracteres '''c'''
 
|-
 
|-
 
|c?
 
|c?
|cero o un carácter **c**
+
|cero o un carácter '''c'''
 
|-
 
|-
 
|\n
 
|\n
Línea 73: Línea 74:
 
|-
 
|-
 
|<nowiki>\</nowiki>
 
|<nowiki>\</nowiki>
|carácter de **escape** para escribir caracteres especiales:   
+
|carácter de '''escape''' para escribir caracteres especiales:   
 
<nowiki>^ . [ ] % ( ) | * ? { } \</nowiki>
 
<nowiki>^ . [ ] % ( ) | * ? { } \</nowiki>
 
|-
 
|-
 
|(cd)
 
|(cd)
|agrupación: los caracteres **c** y **d** juntos
+
|agrupación: los caracteres '''c''' y '''d''' juntos
 
|-
 
|-
 
|c<nowiki>|</nowiki>d
 
|c<nowiki>|</nowiki>d
|carácter **c** o carácter **d**
+
|carácter '''c''' o carácter '''d'''
 
|-
 
|-
 
|c{n}
 
|c{n}
|exactamente **n** repeticiones del carácter **c**
+
|exactamente '''n''' repeticiones del carácter '''c'''
 
|-
 
|-
 
|c{n,}
 
|c{n,}
|**n o más** repeticiones del carácter **c**
+
|'''n o más''' repeticiones del carácter '''c'''
 
|-
 
|-
 
|c{n,m}
 
|c{n,m}
|entre **n y m** repeticiones del carácter **c**
+
|entre '''n''' y '''m''' repeticiones del carácter '''c'''
 
|-
 
|-
 
|[a-z]
 
|[a-z]
Línea 101: Línea 102:
 
|-
 
|-
 
|[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** (c, d, e o f)
+
|cualquier letra entre '''c''' y '''f''' (c, d, e o f)
 
|-
 
|-
 
|[^c]
 
|[^c]
|cualquier carácter que **no** sea **c**
+
|cualquier carácter que '''no''' sea '''c'''
 
|-
 
|-
 
|<nowiki>[[:alnum:]]</nowiki>
 
|<nowiki>[[:alnum:]]</nowiki>
Línea 130: Línea 131:
 
|cualquier letra mayúscula
 
|cualquier letra mayúscula
 
|}
 
|}
 +
 
====Expresiones regulares en PHP====
 
====Expresiones regulares en PHP====
  
Línea 135: Línea 137:
 
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.*  
+
''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
 
http://php.net/manual/es/function.preg-match.php
  
Línea 142: Línea 144:
 
Es muy importante distinguir entre:
 
Es muy importante distinguir entre:
  
* **Coincidencia parcial:** la cadena *contiene* el patrón en algún punto.   
+
* '''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).
+
* '''Coincidencia exacta''': la cadena debe '''coincidir por completo''' con el patrón (inicio y fin).
  
Para entender esta diferencia, veamos el siguiente ejemplo:
+
La expresión siguiente especifica una cadena que **contenga** uno o más números:
 
+
La expresión regular siguiente especifica una cadena que **contenga** uno o más números:
+
  
 
<source lang=php>
 
<source lang=php>
Línea 153: Línea 153:
 
</source>
 
</source>
  
Analicemos algunas cadenas:
+
Ejemplos:
  
 
<source lang=php>
 
<source lang=php>
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene el número 1
+
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene un número
 
$cad2 = "1";              // Cumple
 
$cad2 = "1";              // Cumple
 
$cad3 = "134124";          // Cumple
 
$cad3 = "134124";          // Cumple
$cad4 = "asdfasd4";        // Cumple: contiene el número 4
+
$cad4 = "asdfasd4";        // Cumple
$cad5 = "asdfasd";        // No cumple: no tiene ningún número
+
$cad5 = "asdfasd";        // No cumple
 
</source>
 
</source>
  
Sin embargo, si queremos especificar que la cadena **solo** contenga números, entonces debemos indicar que:
+
Si queremos que la cadena '''solo''' contenga números:
 
+
* la cadena **empiece** por un número  → `^`
+
* la cadena **termine** por un número → `$`
+
  
Por ejemplo:
+
* debe '''empezar''' por un número → ^
 +
* debe '''terminar''' por un número → $
  
 
<source lang=php>
 
<source lang=php>
Línea 174: Línea 172:
 
</source>
 
</source>
  
En este caso, solo la cadena **$cad3** cumple la expresión, ya que es la única formada únicamente por números.
+
En el ejemplo anterior, solo '''$cad3''' cumple esta expresión.
  
 
{{MRM_Recursos de la Web|
 
{{MRM_Recursos de la Web|
#https://regex101.com/ (Para practicar)
+
#https://regex101.com/
 
#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
Línea 194: Línea 192:
 
<source lang=php>
 
<source lang=php>
 
<!DOCTYPE html>
 
<!DOCTYPE html>
<!--
+
<!-- Ejemplo de validación con expresiones regulares -->
Ejemplo de validación con expresiones regulares.
+
-->
+
 
<?php
 
<?php
 
if ($_POST['enviar']) {
 
if ($_POST['enviar']) {
Línea 255: Línea 251:
 
}
 
}
 
input[type=submit] {
 
input[type=submit] {
     padding:5px 15px 10px 10px;
+
     padding:5px 15px 10px;
 
     background:#ccc;
 
     background:#ccc;
    border:2;
 
 
     cursor:pointer;
 
     cursor:pointer;
    -webkit-border-radius: 5px;
 
 
     border-radius: 5px;
 
     border-radius: 5px;
 
     margin: 1em;
 
     margin: 1em;
Línea 276: Línea 270:
 
}}
 
}}
  
</div>
 
 
{{MRM_Actividad|Title=Practica con expresiones regulares|
 
{{MRM_Actividad|Title=Practica con expresiones regulares|
;Realiza una app que valide datos de entrada de un formulario
+
;Realiza una app que valide datos de entrada de un formulario
*La aplicación va a validar los siguientes items
+
*La aplicación va a validar los siguientes ítems:
 
[[archivo:formulario_datos_personales.png]]
 
[[archivo:formulario_datos_personales.png]]
 
 
}}
 
}}
 +
 +
</div>

Revisión de 19:46 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). 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.






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 ítems:

Formulario datos personales.png