PHP expresiones regulares - Parte VI Introducción Muchos de los ejemplos que hemos encontrado son ejemplos sencillos. En esta sección veremos dos ejemplos que son más exigentes. Antes de dejar esta parte de la serie, vamos a hablar de lo que se llama Backtracking. Pasos necesarios para construir una expresión regular Estos son los pasos necesarios para construir una expresión regular: * Especifique la tarea en detalle, * Divida el problema en partes más pequeñas, * Traducir las pequeñas piezas en expresiones regulares, * Combinar las expresiones regulares, * Optimizar la final combinado expresiones regulares.
Dos ejemplos Ejemplo 1 hexadecimal Código de Color Comprobar Especificación de la tarea en detalle un ejemplo de un código de color hexadecimal es # 4C8. Otro ejemplo es el # 44CC88. * Es un código hexadecimal comienza con un hash, seguido por cualquiera de 3 números hexadecimales o 6 números hexadecimales. * Los dígitos hexadecimales son: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. * Las letras hexadecimales pueden estar en mayúsculas o minúsculas. Rompiendo el problema en partes más pequeñas * Comienza con un #.
* Le siguen 3 números hexadecimales o * 6 números hexadecimales * No hay personaje después de los 3 o 6 dígitos hexadecimales. Que se traduce en expresiones regulares Hay tres partes pequeñas arriba. La primera parte da la expresión regular: /^ # /La segunda parte da la expresión regular: /[0-9a-fA-F] {3} /La tercera parte da la expresión regular: /[0-9a-fA-F] { 6} /La última parte da la expresión regular: /$ /Combinando la expresiones regulares Esta es la expresión regular combinado: /^ # ([0-9a-fA-F] {3} $) | ([0-9a-fA-F ] {6} $) /Nota del metacarácter suplente, | para los tres o seis dígitos hexadecimales.
También tenga en cuenta los paréntesis que separan a los grupos alternativos. Optimización de la Combinada Regex Esto significa acortar la expresión regular combinado. Tenga en cuenta que 0-9 se abrevia a \\ d. Así que en la expresión regular combinado, cambiamos las dos apariciones de 0-9 a \\ d. La expresión regular optimizado es: /^ # ([\\ da-fA-F] {3} $) | ([\\ da-fA-F] {6} $) /Esta expresión es más corto que el anterior por dos caracteres.
El siguiente código ilustra esto: $ subject = "# 44CC88"; si (preg_match ("/^ # ([\\ da-fA-F] {3} $) | ([\\ da-fA-F] {6} $) /", $ asunto)) echo "emparejada". "Else echo" No Igualados "."?> Ejemplo 2 Nombre de Usuario Comprobar Especificación de la tarea en detalle Supongamos que tenemos un sitio donde los usuarios tienen que iniciar sesión. Podemos decirle al usuario que su nombre debe contener letras en minúsculas o superior y /o dígitos de cero a 9 y /o el carácter de subrayado, _. También insistimos en que el nombre no debe ser inferior a 3 caracteres o mayor que 18 caracteres.
En este ejemplo hemos impuesto los detalles de las especificaciones. Rompiendo el problema en partes más pequeñas Un nombre de inicio de sesión se compone de * las letras del alfabeto en minúsculas o superior entre 3 a 18 letras, ambos inclusive, y /o * los dígitos del 0 al 9 entre 3 a 18 dígitos, incluido, y /* o el guión bajo entre 3 a 18 dígitos, incluido. Esto significa, que puede tener hasta 18 caracteres de subrayado para un nombre. Dejemos que por simplicidad. * Hay que limitar la cadena de asunto a 3 o 6 caracteres.
Que se traduce en expresiones regulares La expresión regular para el primer punto es: /^ [a-zA-Z] {3,18} $ /La expresión regular para el segundo punto es: /^ [0-9] {3,18} $ /El regex para el tercer punto es: /^ [_] {3,18} $ /El cuarto punto es inherente a las expresiones regulares anteriores. Combinando las expresiones regulares En la sección de descomposición, los tres puntos anteriores se combina con la frase, "y /o" No hay forma directa de hacer esto, así que tenemos que deducirlo.
Esta es la expresión regular combinado: /^ [a-zA-Z0-9 _] {3,18} $ /Optimización del Regex Combinado Esto significa acortar la expresión regular combinado. Tenga en cuenta que la clase [a-zA-Z0-9_] se abrevia a \\ w. La expresión regular optimizado es: /^ [\\ w] {3,18} $ /Backtracking Hemos visto cómo hacer coincidir las alternativas utilizando el metacarácter alternancia, |. Cuando juego alternativas, PHP utiliza un proceso conocido como marcha atrás. Voy a ilustrar esto con un ejemplo.
Considere la siguiente expresión: preg_match ("/(124 | 123) (46 | 4 | 45) /", "12345") Voy a explicar el retroceso de explicar el funcionamiento de la expresión anterior. Los siguientes pasos explican cómo PHP resuelve esta expresión. A. Se inicia con el primer número en la cadena de asunto '1'. B. Se trata de la primera alternativa en el primer sub-patrón '124'. C. Se ve el juego de '1' seguido de '2'. Eso esta bien. D. Se da cuenta de que "4" en la expresión regular no coincide '3' en la cadena de asunto - que es un callejón sin salida.
Por lo tanto, retrocede dos personajes de la cadena de asunto y recoge la segunda alternativa en el primer sub-patrón "123". E. Coincide con '1' seguido de '2' seguido de '3'. El primer sub-patrón está satisfecho. F. Se mueve a la segunda sub-patrón y recoge la primera alternativa '46'. G. Se coincide con el '4' en la cadena de sub-patrón. H. Sin embargo, '6' en la expresión regular no coincide con '5' en la cadena de sub-patrón, por lo que es un callejón sin salida. Se retrocede un carácter en la cadena de sub-patrón y recoge la segunda alternativa en el segundo sub-patrón '4'. '4' I.
partidos. El segundo sub-patrón está satisfecho. J. Somos al final de la expresión regular; ¡Hemos terminado! Hemos igualado '1234' de la cadena de asunto "12345". Hay dos cosas a tener en cuenta acerca de este proceso. En primer lugar, la tercera alternativa en el segundo sub-patrón '45' también permite que un partido, pero el proceso se detuvo antes de llegar a la tercera alternativa - en una posición de carácter dado, más a la izquierda conquista. En segundo lugar, el proceso fue capaz de conseguir un partido en la primera posición de carácter de la cadena de asunto '1'.
Si no hubo partidos en la primera posición, PHP sería pasar a la segunda posición de carácter '2' y tratar el partido de nuevo. PHP se da por vencido y se declara "12345" = ~ /(124 | 123) (46 | 4 | 45) /, que es falso, sólo cuando todos los caminos posibles en todas las posibles posiciones de caracteres se han agotado. La x Modificador Detalles Este modificador se establece poniendo x en minúscula justo al lado de la segunda barra diagonal de la expresión regular.
Es decir: /patrón /x Si se aplica este modificador, caracteres de datos de espacio en blanco en el patrón son totalmente ignorado excepto cuando escapado o dentro de una clase de caracteres y caracteres entre un sin escapar # fuera de una clase carácter y el siguiente carácter de nueva línea, inclusive, son También ignorado. Voy a ilustrar todo esto. Dice caracteres de datos de espacio en blanco en el patrón son totalmente ignorados excepto cuando escapado o dentro de una clase de caracteres. Considere la cadena de asunto: $ subject = "Soy un hombre sentado.
"; La siguiente expresión con el modificador de x no produce una coincidencia. preg_match ("/hombre sentado /x", $ sujeto) Esto es porque en la expresión regular, el único espacio entre "hombre" y "sentado" y "sentado" y "abajo" no se reconocen, con la presencia de la x modificador. Si elimina estos espacios correspondientes en el tema que tendrá un partido, con el modificador de x. El siguiente tema se produzca una coincidencia con la expresión regular anterior: $ subject = "Soy un mansittingdown.
"; Si desea que el tema original y expresiones regulares para que coincida, entonces usted tiene que escapar de los espacios en la expresión regular. La siguiente expresión produce una coincidencia con el tema original: preg_match ("/hombre \\ \\ sentado abajo /x", $ sujeto) Un escapó espacio sencillo es "\\". Hablemos ahora sobre el espacio blanco en una clase de caracteres. Tenga en cuenta que el espacio en blanco es en realidad [\\ \\ t \\ r \\ n \\ f], no sólo "\\". Sin embargo, vamos a seguir nuestro ejemplo usando "\\".
Utilizamos el mismo tema, es decir: $ subject =; "Yo soy un hombre sentado." Si queremos que coincida con el espacio delante de la sesión, seguido por "sentado", con el modificador de x, entonces nuestra expresión regular podría ser; /[] Sentado /x Tenga en cuenta que el espacio en blanco en la clase de caracteres no se ha escapado. Es decir, con la x modificador, los espacios en blanco dentro de una clase de caracteres no se escapó, mientras que los espacios en blanco fuera de la clase de caracteres se escapó.
La siguiente expresión produce una coincidencia: preg_match ("/[] sentado /x", $ sujeto) Con el modificador de x, se ignora cualquier texto entre el carácter # y el carácter de nueva línea implícita o explícita. Un carácter de nueva línea implícita se consigue pulsando la tecla Intro cuando se está escribiendo. Un carácter de nueva línea explícita se logra escribiendo el carácter \\ n. Considere el siguiente código: $ subject = "Soy un hombre sentado."; $ re = "/hombre \\ #comentario va aquí sentado /x"; si (preg_match ($ re, $ asunto)) echo "emparejada". ".
"? "Else echo" No Emparejado> El tema es: $ subject = "Yo soy un hombre sentado."; La expresión regular es: $ re = "/hombre \\ #comentario va aquí sentado /x"; Tenga en cuenta la presencia del carácter # y el carácter de nueva línea implícita, obtenida después de la palabra "aquí" pulsando la tecla Intro. Un partido se produjo. La subcadena que en realidad corresponde es "hombre sentado". En el siguiente código, el carácter de nueva línea es explícita, con \\ n. También se produce una coincidencia. $ subject = "Soy un hombre sentado.
"; $ re = "/hombre \\ #comentario va aquí \\ nsitting /x"; si (preg_match ($ re, $ asunto)) echo "emparejada". "Else echo" No Igualados "."?>