Diferencia entre revisiones de «Plantilla:PHP/ExpresionesRegulares»

De WikiEducator
Saltar a: navegación, buscar
(Coincidencia exacata o qué contenga)
 
(17 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
<div id=parrafo>
 
<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 comprobar si una determinada expresión compuesta por una serie de caracteres concretos, cumple o no la expresión regular<br />
+
=== Expresiones Regulares (ER)===
Esta es una técnica extremadamente útil para verificar cualquier tipo de cadena de caracteres, por ejemplo teléfono, email, url, etc.<br />
+
 
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 />
+
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.
*A continuación algún ejemplo para exponer esta idea
+
 
 +
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====
<br />
+
 
 +
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|
 
{{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
 
}}
 
}}
*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
+
 
 
<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 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 73:
 
|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 131:
 
|cualquier letra mayúscula
 
|cualquier letra mayúscula
 
|}
 
|}
====Expresiones regulares en php====
 
Ŝon varias las funciones relacionadas con expresiones regulares en php
 
http://php.net/manual/es/book.pcre.php
 
<br/>
 
*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
 
A continuación se proponen dos actividades para practicar con expresiones regulares
 
{{MRM_Actividad|Title=Verificar cadena con expresiones|
 
Realizar una aplicación que permita tener dos cajas de texto
 
*En una insetaremos la expresión regular
 
*En la siguiente  insertaremos una cadena para ver si cumple o no la expresión regular
 
{{Plegable|hide|Validar expresiones regulares|
 
<source lang=php>
 
  
</source>}}
+
====Expresiones regulares en PHP====
}}
+
 
====Coincidencia exacata o qué contenga====
+
Son varias las funciones relacionadas con expresiones regulares en 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 />
+
http://php.net/manual/es/book.pcre.php
Para aclarar este concepto vamos a ver el siguiente ejemplo:
+
 
La siguiente expresión regular establece una cadena que contenga 1 o más números.
+
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>
 
<source lang=php>
$exp = /[0-9]+/
+
$exp = /[0-9]+/;
 
</source>
 
</source>
  
*Observamos las siguientes cadenas
+
Ejemplos:
 +
 
 
<source lang=php>
 
<source lang=php>
$cad1 = "asdfljoieka1asdf"; //Cumple por que tiene un número
+
$cad1 = "asdfljoieka1asdf"; // Cumple: contiene un número
$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
$cad5 = "asdfasd"; //No Cumple por que no  tiene un número
+
$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 → $
  
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).
 
 
<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.
 
  
{{Recursos de la Web|  
+
En el ejemplo anterior, solo '''$cad3''' cumple esta expresión.
#http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html
+
 
 +
{{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
 
#http://php.net/manual/es/book.pcre.php
 
}}
 
}}
{{MRM_Ejercicio|Title=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|
+
{{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>
 
<html>
 
     <head>
 
     <head>
Línea 164: Línea 218:
 
     </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>
 +
                <input type="text" name="expresion" value="<?= $expresion ??""; ?>"><br>
  
                <label for="expresion">Expresion</label>
 
                <input type="text" name="expresion"  ><br>
 
 
                 <label for="cadena">Cadena</label>
 
                 <label for="cadena">Cadena</label>
                 <input type="text" name="cadena"><br>
+
                 <input type="text" name="cadena" value="<?= $cadena ??"";><br>
 +
 
 
                 <input type="submit" name="enviar" value="Enviar">
 
                 <input type="submit" name="enviar" value="Enviar">
                 <?php
+
                 <?php echo $msg; ?>
                if ($_POST['enviar']) {
+
                    $exp = filter_input(INPUT_POST, "expresion");
+
                    $cad = filter_input(INPUT_POST, "cadena");
+
                    if (preg_match("/$exp/", $cad))
+
                        echo "<label>La Cadena  <strong>$cad</strong>  es de la expresion  <strong>$exp</strong> </label>";
+
                    else
+
                        echo "<label>La Cadena  <strong>$cad</strong>  NO es de la expresion  <strong>$exp</strong> </label>";
+
                    // put your code here
+
                }
+
                ?>
+
 
             </form>
 
             </form>
 
         </fieldset>
 
         </fieldset>
 
 
     </body>
 
     </body>
 
</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 210: 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 220: Línea 259:
 
}
 
}
 
label{
 
label{
    font-weight: bold;
+
     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>
 
 
 
}}
 
}}
 
}}
 
}}
 +
 +
{{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

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