En previsión del inicio de un nuevo hilo en el curso "Backend-developer in PHP" , así como el curso relacionado "Framework Laravel" , queremos compartir el artículo preparado por nuestro autor independiente.
Atencion Este artículo no es relevante para el programa del curso y será útil solo para principiantes . Para obtener un conocimiento más profundo, lo invitamos a visitar un intensivo en línea gratuito de dos días sobre el tema: "Crear un Telegram-bot para ordenar café en la institución y pagar en línea" . El segundo día de intenso se llevará a cabo aquí .

Hola a todos! Todo con el próximo
[20]{2,}0
años. Hoy quiero tocar un tema que a veces es un tema para bromas de "¿Por qué necesitas aprender todo esto si ya tienes soluciones preparadas" para "¿también puedes aprender todo sobre Perl?" Sin embargo, pasa el tiempo, muchos programadores comienzan a dominar las expresiones regulares, y en Habré no hay un solo artículo nuevo (
aunque las expresiones regulares no hayan cambiado mucho últimamente ) sobre este tema. ¡Es hora de escribir otro!
Expresiones regulares aisladas de su implementación específica
Las expresiones regulares (denotadas en inglés como
RegEx o como expresiones regulares) son una herramienta que se utiliza para varias opciones para estudiar y procesar texto: buscar, verificar, buscar y reemplazar un elemento que consiste en letras o números (o cualquier otro carácter en incluidos caracteres especiales y caracteres de puntuación). Inicialmente, las expresiones regulares llegaron al mundo de la programación desde el entorno de la investigación científica, que se llevó a cabo en los años 50 en el campo de las matemáticas.
Décadas más tarde, los principios e ideas se transfirieron al entorno del sistema operativo UNIX (en particular, se incluyeron en la utilidad
grep
) y se implementaron en el lenguaje de programación Perl, que en los albores de Internet se usaba ampliamente en el backend (y hasta el día de hoy se usa, pero ya menos) para dicha tarea. como la validación de formularios.

Si parecen ser simples, ¿por qué dan tanto miedo a primera vista?
De hecho, cualquier expresión puede ser "regular" y puede usarse para verificar o buscar cualquier carácter. Por ejemplo, las palabras
Pavel o
example@mail.ru también se pueden usar como clientes habituales, solo, por supuesto, en una clave bastante estrecha. Para probar el rendimiento de las expresiones regulares en el entorno PHP sin iniciar su servidor o alojamiento, puede usar el siguiente
servicio en línea (simplemente no funciona con el procesamiento de caracteres rusos en él). Para empezar, solo usamos
Pavel como una expresión regular.
Supongamos que tenemos el siguiente texto:
Pavel sabe demasiado.
Pavel usando nginx y él no es divagante.
Ahora las expresiones regulares han encontrado ambas ocurrencias de la palabra Pavel. Es genial, pero no suena muy útil (a menos que por alguna razón intentes analizar algo como la cantidad de mención de la palabra
señor en War and Peace a través de Vim y Python, pero no tengo preguntas para ti).
Variabilidad de expresión
Si su expresión regular es variable (por ejemplo, solo conoce una cierta parte de ella y necesita encontrar el número de ocurrencias de años, comenzando desde 2000 y terminando en 2099), entonces podemos usar la siguiente expresión regular:
20 ..Texto: Los escritores jóvenes escriben muchas cosas. Por ejemplo, un escritor nacido en 2002 es muy diferente de 2008 y 2012.Aquí, con la ayuda de expresiones regulares, podemos encontrar todos los años, pero hasta ahora esto no tiene sentido. Lo más probable es que no necesitemos años más allá de 2012 (aunque los escritores jóvenes menores de 8 años pueden ofenderse, pero no por eso ahora). Vale la pena estudiar conjuntos de caracteres, pero más sobre eso más adelante, porque ahora hablaremos de otra parte importante de las expresiones regulares: escapar de metacaracteres.
Imagine que necesitamos encontrar el número de ocurrencias de archivos con la extensión
.doc
(supongamos que exportamos solo ciertos archivos cargados a nuestra base de datos). ¿Pero un punto simplemente significa algún personaje? Entonces que hacer?
Aquí, escapar de metacaracteres con una barra diagonal inversa nos ayuda. Ahora la expresión
\.doc
tendrá el éxito suficiente para buscar cualquier mención de texto con la extensión
.doc
:
Expresión regular:
\.doc
Texto: kursach
.doc ,
nepodozritelneyfail.exe
, work
.doc ,
shaprgalka.rtf doc
Como puede ver, podemos encontrar con éxito la cantidad de archivos con la extensión
.doc
en la lista. Sin embargo, no podemos extraer los nombres de archivo completos usando esta expresión regular, por ejemplo, en una matriz. Es hora de echar un vistazo a los conjuntos de caracteres.
Une todo un conjunto de personajes
En expresiones regulares, la coincidencia con un conjunto se proporciona mediante metacaracteres: corchetes
[ ]
. Se pueden especificar dos caracteres ASII como el inicio y el final de un rango. Para una implementación simple, supongamos que queremos encontrar todos los archivos numerados del 0 al 9 con la extensión
.jpg
.
Expresión regular:
[0-9]\.jpg
Texto:
1.jpg ,
2.jpg ,
3.jpg , photo.jpg, anime.jpg,
8.jpg , jkl.jpg
Vale la pena señalar que el nombre de archivo de más de 1 dígitos no estará cubierto por nuestra expresión regular. Acerca de la opción múltiple será un poco menor, pero por ahora imagine que de repente necesitábamos lograr el resultado opuesto. Agregue el metacarácter
^
(que, por el contrario, tiene hasta dos funciones en expresiones regulares). Para usarlo como una excepción, debe agregarlo exactamente a nuestro conjunto:
Expresión regular:
[^0-9]\.jpg
Texto: 1.jpg, 2.jpg, 3.jpg, phot
o.jpg , anim
e.jpg , 8.jpg, jk
l.jpgPero sin opción múltiple, estas son, por supuesto, expresiones inferiores.
Tablas utiles
Aquí hay una tabla de metacaracteres:
Tabla de metacaracteres de espacios en blanco
Opción múltiple: hacer una validación simple
Armados con el conocimiento adquirido, intentaremos hacer una expresión regular que encuentre, por ejemplo, palabras de menos de 3 letras (una tarea estándar para anti-spam). Si tratamos de usar la siguiente expresión regular -
\w{1,3}
(en la cual el metacarácter
\w
indica cualquier carácter, y los corchetes indican el número de caracteres de cuántos a cuántos, entonces resaltaremos todos los caracteres en una fila; debe designar de alguna manera principio y final de las palabras en el texto, para esto necesitamos el metacarácter
\b
.
Expresión regular:
\b\w{1,3}\b:
Texto: buena palabra
nohuevoNo esta mal! Ahora las palabras de menos de tres letras no podrán ingresar a nuestra base de datos. Veamos la validación de la dirección postal:
Expresión regular:
\w+@\w+\.\w+
Requisitos: en el correo electrónico al principio debe haber cualquier carácter (números o letras, porque el correo electrónico, que consiste solo en números al principio, es bastante común). Luego viene el símbolo
@
, luego tantos caracteres como desee, seguido de un punto escapado (es decir, solo un punto) y un dominio de primer nivel.
Considera la repetición de personajes
Ahora echemos un vistazo más de cerca a cómo repetir caracteres en expresiones regulares. Por ejemplo, desea encontrar cualquier combinación de números del 2 al 6 en el texto:
Expresión regular:
[2-6]+
Texto: Aquí están los 89 diferentes
234 dígitos
de Come
24 .
Déjame darte una tabla de todos los cuantificadores de metacaracteres:
No hay nada complicado en aplicar cuantificadores. Excepto por una advertencia: cuantificadores codiciosos y perezosos. Aquí está la tabla:
Los cuantificadores perezosos difieren de los codiciosos en que toman el número mínimo, no el máximo, de caracteres. Imagine que tenemos la tarea de encontrar todas las etiquetas de encabezado h1-h6 y su contenido, y el resto del texto no debería verse afectado (ingresé deliberadamente la etiqueta h7 inexistente para no ser atormentado por escapar de las etiquetas Habra):
Expresión regular: <h [1-7]>. *? <\ / H [1-7]>
Texto:
<
h7
>
hola </
h7
>
lorem ipsum avada kedavra
<
h7
> comprar <
/h7
>
Todo funcionó con éxito, pero solo gracias al cuantificador diferido. En el caso de usar el cuantificador codicioso, todo el texto entre las etiquetas se destacaría (creo que esto no necesita una ilustración).
Bordes de cadena de caracteres
Los límites de las cadenas de caracteres que ya hemos usado anteriormente. Aquí hay una tabla más detallada:
Trabajar con subexpresiones
Las subexpresiones en expresiones regulares se realizan utilizando el metacaracteres del grupo
()
.
Aquí hay un ejemplo de una expresión regular que puede encontrar universalmente diversas variaciones de direcciones IP.
Expresión regular: (((25 [0-5]) | (2 [0-4] \ d) | (1 \ d {2}) | (\ d {1,2})) \.) {3} (((25 [0-5] | (2 [0-4] \ d) | (1 \ d {2}) | (\ d {1,2}))))
Texto:
255.255.255.255 es solo una dirección
191.198.174.192 wikipedia
87.240.190.67 vk
31.13.72.36 facebook
Utiliza el operador lógico
|
(o) que nos permite componer una expresión regular que coincida con la regla por la cual se compilan las direcciones IP. La dirección IP debe contener de 1 a 3 dígitos, en los cuales un número de tres números puede comenzar con 1, con 2 (o el segundo dígito debe estar entre 0 y 4), o comenzar con 25, y luego 3 dígitos resulta estar entre 0 y 5. Además, debe haber un punto entre cada combinación de números. Usando las tablas anteriores, intente descifrar la expresión regular en la parte superior. Las expresiones regulares al principio te asustan con su largo, pero largo no significa complejo.
Mirar hacia adelante
Para ver una expresión para cualquier combinación de ciertos caracteres, se indica un patrón mediante el cual se detecta una coincidencia, pero no se devuelve. Esencialmente, mirar hacia adelante define una subexpresión y, por lo tanto, se forma en consecuencia. El patrón de sintaxis para mirar hacia adelante consiste en una subexpresión precedida por? =, Y luego el texto que se va a hacer coincidir se sigue por igual.
Aquí hay una tarea específica: hay una contraseña que debe constar de al menos 7 caracteres y debe incluir necesariamente al menos una letra mayúscula y un número. Aquí todo será algo más complicado, porque el usuario debería poder poner la letra mayúscula tanto al principio como en el medio de la oración (y lo mismo debería repetirse con la letra).
Por lo tanto, debemos esperar la expresión. Además, necesitamos dividir los signos en grupos. Y quiero limitar sus tamaños de 8 a 22 caracteres:
/^(?=.*[az])(?=.*[AZ])(?=.*\d)[a-zA-Z\d]{8,}$/
:
Texto:
Qwerty123Im789098contraseña débil
Características del trabajo de expresiones regulares en PHP
Para saber cómo funcionan las expresiones regulares en PHP, consulte las funciones en la documentación oficial de PCRE (Expresiones regulares compatibles con Perl), que está disponible en el sitio web oficial. La expresión debe estar encerrada en delimitadores, por ejemplo, en barras diagonales.
Los caracteres arbitrarios pueden ser un delimitador, excepto alfanuméricos, barra invertida '\' y cero byte. Si el carácter delimitador aparece en el patrón, se debe escapar \. Como separadores, las combinaciones provienen de Perl: (), {}, [].
¿Qué funciones se usan en php? El paquete PCRE proporciona las siguientes características para admitir expresiones regulares:
- preg_grep () : realiza una búsqueda y devuelve una matriz de coincidencias.
- preg_match () : busca la primera coincidencia utilizando expresiones regulares
- preg_match_all () - Realiza una búsqueda global usando expresiones regulares
- preg_quote () - toma una plantilla y devuelve su versión escapada
- preg_replace () - realiza una operación de búsqueda y reemplazo
- preg_replace_callback () : también realiza una operación de búsqueda y reemplazo, pero utilizan la devolución de llamada, una función para cualquier reemplazo específico
- preg_split () - divide una cadena de caracteres en subcadenas
El modificador
i
para organizar coincidencias sin distinción entre mayúsculas y minúsculas.
Usando el modificador
m
, puede activar el modo de procesamiento de texto multilínea.
El reemplazo de cadenas se puede calcular como código PHP. Para activar este modo, use el modificador
e .
Todas las
preg_split()
preg_replace()
,
preg_replace_callback()
y
preg_split()
admiten un argumento adicional, que introduce restricciones en el número máximo de reemplazos o particiones.
Los vínculos de retroceso se pueden indicar con el signo $ (por ejemplo, $ 1), y en versiones anteriores, se usan los signos \\ en lugar del signo $.
Los metacaracteres \ E, \ l, \ L, \ u y \ U no se utilizan (por lo tanto, no se mencionaron en este artículo).
Nuestro artículo estaría incompleto sin las clases de caracteres POSIX, que también funcionan en PHP (y en general pueden aumentar la legibilidad de sus clientes habituales, pero no todos tienen prisa por aprender, porque a menudo rompen la lógica de la expresión).
Al final daré un ejemplo de una implementación concreta de expresiones regulares en PHP, usando las implementaciones mencionadas anteriormente. También agregué la validación del nombre de usuario para que no pudiera ingresar combinaciones demasiado cortas de letras (bueno, supongamos que estos son apodos, no nombres, los nombres son más cortos que dos letras):
$pattern_name = '/\w{3,}/'; $pattern_mail = '/\w+@\w+\.\w+/'; $pattern_password = '/^(?=.*[az])(?=.*[AZ])(?=.*\d)[a-zA-Z\d]{8,}$/'; if (preg_match($pattern_name, $name) && preg_match($pattern_mail, $mail) && preg_match($pattern_password, $_POST['password'])) {
¡Gracias a todos por su atención! Por supuesto, hoy hemos tocado solo una parte de las expresiones regulares y se pueden escribir algunos artículos más sobre ellas. Por ejemplo, no hablamos sobre la implementación de la búsqueda de repeticiones de palabras idénticas en el texto. Pero espero que el conocimiento adquirido sea suficiente para escribir significativamente mi primera validación de formularios y solo luego pasar a cosas más furiosas.
Por tradición, algunos enlaces útiles:Hoja de trucos de expresión regular del MIT
La parte oficial de la
documentación de php regex.
Eso es todo. ¡Nos vemos en el intensivo !El segundo día de intenso se llevará a cabo aquí.