Autor Tema: Expresiones regulares con PHP  (Leído 2172 veces)

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Expresiones regulares con PHP
« en: 15 de Abril de 2010, 06:50:47 am »
¡Hola!

Últimamente me he puesto a aprender expresiones regulares y me he decidido por venir a crear un pequeño tutorial con lo que he aprendido hasta el momento de esta característica que poseen casi todos los lenguajes de programación.

¿Qué son las expresiones regulares?
Son una potente herramienta que nos permite encontrar un texto en alguna cadena mediante un patrón de búsqueda.

Ejemplo:

Citar
Patrón: ca
Coincidencias: acampar, casa, precario, mueca.

Como pueden ver, en el anterior ejemplo coinciden las palabras que tienen la sílaba ca.

Sintaxis

- Inicio y fin de patrón
Para determinar en qué lugar queremos que el patrón comienze a buscar en la cadena (principio o final), podemos usar los siguientes símbolos:

^: Buscar al inicio de una cadena.
Citar
Patrón: ^la
Coinciden: lagarto, lambada, lago, lata.
No coinciden: hola, bola, colateral.

$: Buscar al final de una cadena.
Citar
Patrón: la$
Coinciden: bola, cola, empolla, cebolla.
No coinciden: lagarto, colateral, etc...

Metacaracteres

- El punto (.)
Esto es por decir algo así el "metacaracter superior", puede reemplazar cualquier caracter (letras, números, símbolos) excepto los saltos de línea.

Citar
Patrón: mo.a
Coincidencias: mora, mota, mola, moca, mo_a, mo9a, mo-a, mo#a, etc...

- Cuantificadores
Sirven para indicarle al patrón que un elemento se va a repetir indeterminadas veces. Existen tres tipos de cuantificadores:

+: Sirve para indicarle al patrón que el caracter anterior al símbolo más (+) se va a repetir una o más veces.
Citar
Patrón: come+
Coinciden: comee, comeee, comeeeeee, etc..
No coincide: come.

*La palabra "come" no coincide debido a que su último caracter no se repite ninguna vez.*

*: Con este símbolo (asterisco) estamos especificando que el anterior caracter al asterisco (*) puede repetirse cero o más veces.
Citar
Patrón: cocoa*
Coinciden: coco, cocoa, cocoaa, cocoaaa, etc...

Otro ejemplo:

Patrón: coco*a
Coinciden: coca, cocoa, cocooa, cocoooa, etc...

?: El signo de interrogación se usa para indicar que el último caracter antes del signo de pregunta (?) puede repetirse cero o una vez.
Citar
Patrón: casa?
Coinciden: cas, casa.
No coinciden: casaa, casaaa, casaaaa, etc...

Además de los símbolos cuantificadores comunes, también se puede definir la cantidad de veces que se puede repetir un caracter, para ello se usan las llaves; { }, entre las que se establecerán los parámetros indicando cuantas veces se repite el caracter.
Citar
Patrón: casa{3}
Coincide: casaaa (debido a que la "a" se repite el número indicado entre llaves, en este caso tres).
No coinciden: cas, casaa, casaaa, etc... (contrario a lo anteriormente mencionado).

Como siempre, el cuantificador puede estar ubicado en cualquier lugar del patrón, ejemplo:

Patrón: cas{2}a
Coincide: cassa.
No coinciden: casa, casssa, cassssa, etc...

Aunque también se puede especificar un intervalo entre qué cantidad de veces debe estar el caracter:
Citar
Patrón: casa{2,5}
Coinciden: casaa, casaaa, casaaaa y casaaaaa.
No coinciden: casa, casaaaaaa, etc...  (no coinciden debido a que el caracter no se repite la cantidad de veces especificada: más de dos y menos de cinco).

- Rangos
Los rangos nos sirven para indicar cuáles caracteres son válidos para comparar. Están delimitados por las llaves cuadradas, o corchetes: [ ]. No necesariamente deben estar todos los caracteres o metacaracteres especificados dentro de los corchetes, basta con que esté uno para que la condición se cumpla.
Citar
Patrón: [mp]adre
Coincide con: padre y madre.

También es válido especificar un intervalo entre las letras del abecedario, indicando en cuál comenzar y en cuál terminar:

Patrón: M[a-e]r
Coinciden: mar, mbr, mcr, mdr, mer.

*Si se quiere que sean todas las letras del abecedario se pone: "[a-z]" para todo en mayúsculas, "[A-Z]" para todo en minúsculas y "[a-Z]" para no distinguir entre ambas.*

Lo anteriormente mencionado también se puede realizar con un intervalo numérico:

Patrón: Yo tengo [2-5] carros
Coinciden: Yo tengo 2 carros, Yo tengo 3 carros, Yo tengo 4 carros y Yo tengo 5 carros.
No coinciden: Yo tengo 6 carros, Yo tengo 7 carros, etc...

Aunque también se pueden combinar varios rangos, dependiendo de la posición de los caracteres en la cadena, ejemplo:

Patrón: [GT][2-4][J-L]
Coinciden: G2K, T3J, etc..

Nota: dentro del rango el caracter ^ contará como un negador, es decir: "[^a-z]" coincidirá con cualquier caracter que no sea una letra.

- Agrupadores
Cumplen casi la misma función que los paréntesis en las matemáticas, osea, sirven para agrupar (valga la redundancia) un subconjunto. Esto hace que lo tome como si fuera un caracter. Se delimitan por los paréntesis: ( ).
Citar
Patrón: (abc)+ (como vimos anteriormente, el caracter, en este caso "abc", debe repetirse una o más veces).
Coinciden: abc, abcabc, abcabcabc, etc...
No coinciden: ab, abab, abcab, etc...

Veamos otro ejemplo:

Patrón: ca(sca)?da (como ya sabemos, el caracter, "sca", puede repetirse cero o una vez)
Coinciden: cada y cascada.

- Alternador
En las expresiones regulares, está permitido alternar entre varios valores, ya sea en un agrupador o en un rango. El método de uso es separando las alternativas con una barra vertical: |. Ejemplo:
Citar
Patrón: colombian(as|os)
Coinciden: colombianas y colombianos.

También está el método con rangos:

Patrón: c[ae|1-3]da
Coinciden: cada, ceda, c1da, c2da y c3da.

- Escapado de caracteres
Si queremos escribir en un patrón metacaracteres, pero queremos que este los interprete como caracteres normales, debemos escaparlo, poniendo una barra invertida: \ justo antes del metacaracter que deseemos escapar. Esto hace que el metacaracter sea leido de forma literal y no interpretada

Basado en: este tutorial

En fin, ese ha sido el tutorial sobre expresiones regulares, pronto  publicaré un nuevo tutorial en donde hablaré y explicaré las funciones en las que se utilizan las expresiones regulares. Nos vemos.
« Última modificación: 28 de Junio de 2010, 00:13:19 am por Kevin Wronski »
- Moderador de PHP


Comunidad PHPeros

Expresiones regulares con PHP
« en: 15 de Abril de 2010, 06:50:47 am »

Conectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 165
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Re:Expresiones regulares con PHP
« Respuesta #1 en: 15 de Abril de 2010, 08:14:54 am »
Muy bien explicado, magnifico.
Por favor, leete las Normas


Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #2 en: 15 de Abril de 2010, 16:56:33 pm »
Está muy bien explicado Kevin

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Expresiones regulares con PHP
« Respuesta #3 en: 15 de Abril de 2010, 20:13:22 pm »
Muchas gracias a ambos, me he basado en este tutorial (http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/), solo que como pueden ver, he cambiado los ejemplos, y poniendo explicaciones que considero que entenderán mejor los usuarios.

Pregunta:
¿Pongo la "fuente" en el tutorial? (Aunque no es una "fuente", más bien es como una base xD).
- Moderador de PHP


Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #4 en: 15 de Abril de 2010, 20:46:17 pm »
Buen aporte, anteriormente había publicado un tutorial sobre las expresiones regulares, de todas maneras buen aporte.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado Rodrinete

  • PHPer@ Fijo
  • ***
  • Mensajes: 222
  • Karma: 6
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #5 en: 15 de Abril de 2010, 21:04:43 pm »
Muchas gracias a ambos, me he basado en este tutorial (http://boozox.net/php/manual-completo-y-sencillo-de-expresiones-regulares-en-php/), solo que como pueden ver, he cambiado los ejemplos, y poniendo explicaciones que considero que entenderán mejor los usuarios.

Pregunta:
¿Pongo la "fuente" en el tutorial? (Aunque no es una "fuente", más bien es como una base xD).

Hombre, yo creo que si, pero no lo menciones como fuente si no como base.


Karma+

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Expresiones regulares con PHP
« Respuesta #6 en: 15 de Abril de 2010, 21:09:08 pm »
Hombre, yo creo que si, pero no lo menciones como fuente si no como base.


Karma+

Vale, ya lo puse ;). A propósito; gracias por el Karma  :D
- Moderador de PHP


Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #7 en: 27 de Noviembre de 2010, 11:48:49 am »

Vale, ya lo puse ;). A propósito; gracias por el Karma  :D

Muy bueno Kevin. No recuerdo haber visto este tutorial antes, sino, te hubiese dado un K+ (Que ya te lo he dado en el otro post que estamos debatiendo).

#Fdo. Physlet

Desconectado j0n4th4ntub3

  • PHPerit@
  • *
  • Mensajes: 18
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #8 en: 28 de Noviembre de 2010, 03:00:05 am »
^(gracias|thank you)\s\+(\d)$  :P

Desconectado pcfan

  • PHPerit@
  • *
  • Mensajes: 8
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #9 en: 07 de Diciembre de 2010, 19:00:20 pm »
Muy bueno con este tuto entendi mejor las expresiones regulares ahora a aplicarlas...

Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
Re:Expresiones regulares con PHP
« Respuesta #10 en: 04 de Agosto de 2011, 12:57:53 pm »
Karma+, dejo aquí algunas de las expresiones que hice :P
Validar nick, solo permite números y letras (no distingue entre minúsculas ni mayúsculas

if(!preg_match(&#39;/[a-Z0-9_\-]/i&#39;, $_POST[&#39;user&#39;])){
die(&#39;El nick no es v&aacute;&#39;);
}


La pass se encripta en MD5, asi que no hace falta, por eso, sigo con el mail (Nota: el punto es para los mail de gmail, y el siguiente, para los mail en subdominios)

if(!preg_match(&#39;/[a-Z0-9_\-\.]@[a-z0-9\.]\.[a-z{2,4}]/i&#39;, $_POST[&#39;email&#39;]&#39;)){
die(&#39;El email no es correcto&#39;);
}

Explicacion del mail:

antes de @:
se permiten numeros, letras, puntos y guiones bajos ( _ )
despues de @
se permiten puntos antes del punto (subdominios) y letras, y despues del punto, de 2 a 4 cáracteres para el COM, NET, INFO, CO, CC, etc