Hogar / Descripción general de Windows / PHP regular a partir del número de cadena. PHP regexp: ejemplos de expresiones regulares. Ejemplos de expresiones regulares

PHP regular a partir del número de cadena. PHP regexp: ejemplos de expresiones regulares. Ejemplos de expresiones regulares

Comencemos con qué es una expresión regular. Entonces respóndeme a esta pregunta: ¿hay una “e” en la palabra “prueba”? "¡Comer!" dices. Entonces te hago la segunda pregunta, ¿cómo encontraste la letra "e" en la palabra "prueba"? La respuesta es obvia, tomamos el primer carácter, es decir, “t” y lo comparamos con lo que buscamos, es decir, con “e”. Si no son iguales, entonces tomamos el segundo carácter, es decir, “e”, y lo comparamos con lo que buscamos, es decir, “e”. ¡Voilá! Se encontró una coincidencia. Respuesta: La palabra "prueba" contiene la letra "e".

Ahora respóndeme una pregunta más, ¿dónde está la expresión regular en este ejemplo? Espero que hayas adivinado que la expresión regular aquí es lo que buscamos en la palabra "prueba". Es decir, la letra "e" en este ejemplo es una expresión regular.

¿Para qué se utilizan las expresiones regulares en PHP? En mi práctica, se utilizaban expresiones regulares, por ejemplo, para determinar si una dirección estaba compuesta correctamente. correo electrónico. Estas expresiones también se utilizan para determinar la exactitud del nombre de usuario y la contraseña. Usando expresiones regulares, puede encontrar la dirección en un enlace y guardarla. Hay muchas cosas que puedes hacer. Al analizar esto, puedes identificar la función principal de las expresiones regulares y dos funciones secundarias. Función principal , esta es una búsqueda de coincidencias en una cadena. Los efectos secundarios incluyen guardar las coincidencias encontradas y reemplazarlas.

Primera expresión regular

En teoría, sabemos cómo encontrar el carácter "e" en la palabra "prueba", pero ¿cómo se implementa esto en la práctica? Para utilizar expresiones regulares en php se suelen utilizar las siguientes funciones:

preg_match("expresión regular (patrón)", "variable en la que se realiza la búsqueda", "Variable en la que se guarda el resultado de la búsqueda (parámetro opcional)"); - Función de coincidencia
preg_replace("expresión regular (patrón)", "Con qué reemplazar la coincidencia encontrada", "variable en la que se realiza el reemplazo"); - Reemplazar función

Comencemos a usar estas funciones. Aquí hay un ejemplo de búsqueda del carácter "e" en la palabra "prueba":

$a = "prueba";
if(preg_match("/e/",$a)) echo "encontrado!";

El código describe la condición: si se encuentra algo que coincida con el patrón en la variable $a, se mostrará el mensaje "¡¡encontrado!!" Como habrás notado, nuestra plantilla se encuentra entre dos "/". EN en este caso símbolo "/" Simboliza el principio y el final de nuestro patrón.. Espero que esto quede claro.

Todo esto es interesante, por supuesto… pero nuestra plantilla es muy sencilla, ¿no crees? Después de todo, rara vez necesitamos encontrar algún símbolo en una variable. En la mayoría de los casos necesitamos encontrar muchos personajes, y también desconocidos. ¿Cómo puede ser esto? Plantémonos un problema e intentemos solucionarlo. Supongamos que tenemos una cadena que consta de números y una letra inglesa desconocida.

¿Cómo encontrar esta carta? Podría haber cualquier letra del alfabeto inglés, ¿cómo puedes identificarla? Tú mismo respondiste tu pregunta, hay cualquier letra, es decir, está en el rango de la a a la z. Puede utilizar rangos en expresiones regulares. Si no sabemos qué carácter estamos buscando, pero sabemos con certeza que ese carácter es una letra del alfabeto inglés, entonces la entrada será la siguiente:

$a = "123a321";
if(preg_match("//",$a)) echo "encontrado!";

Tenga en cuenta que el rango está entre corchetes "[" "]". Todo lo que está entre paréntesis se define como uno símbolo, en este caso el símbolo va de la a a la z. Si necesitamos encontrar no una letra, sino un número, entonces la entrada será así:

$a = "abc1cba";
if(preg_match("//",$a)) echo "encontrado!";

También quiero señalar que las expresiones regulares distinguen entre mayúsculas y minúsculas, por lo que los caracteres “A” y “a” son completamente diferentes, para buscar ambos caracteres, escribe así:

$a = "123a321";
if(preg_match("//",$a)) echo "encontrado!";

También existe una búsqueda de letras rusas, que se realiza de la misma forma que con las inglesas:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "encontrado!";

Metacaracteres

Aprendimos cómo buscar un carácter desconocido en una cadena. ¿Qué hacer si necesitamos encontrar varios personajes? Los llamados metasímbolos vienen al rescate... Supongamos que tenemos una cadena con números y letras, ¿cómo podemos describirla en la plantilla? Puedes hacer esto:

línea - 123a321
muestra -

Hmm... la plantilla en realidad coincide con nuestra cadena, y cuando se verifique su cumplimiento, ¡dará la verdad tan esperada! Pero es un registro un tanto engorroso, ¿no crees?

He aquí cómo acortarlo:

línea - 123a321
muestra - *

Me parece que es más corto ¿Qué es el símbolo “*”? Este es el mismo metasímbolo, lo que significa que el símbolo que describimos (es decir, un símbolo que puede contener números del 0 al 9 o letras del alfabeto inglés, de la a a la z) se puede repetir indefinidamente o más de una vez. ¡Sí, sí! Este metasímbolo encontrará una coincidencia en una variable vacía, ya que incluso la ausencia del símbolo que describimos devolverá verdadero. recuerda esto

¿Qué otros metacaracteres hay?

Por ejemplo, el metacarácter "+" es casi similar al metacarácter "*" con una pequeña excepción. "*" devolverá verdadero incluso si no hay ningún carácter, y "+" comprobará la presencia de al menos un carácter. Es decir, si una línea requiere la presencia mínimo un carácter y luego use "+" en lugar de "*"

El metacarácter "?" también se utiliza a menudo. Significa que la línea no debe contener más de un carácter deseado. Permítanme dar un par de ejemplos de los dos últimos metacaracteres que describí.

Supongamos que necesitamos verificar que la contraseña del usuario sea correcta. Pensemos en lo que debe contener la contraseña de usuario. Bueno, en primer lugar, debe ser al menos un personaje. En segundo lugar, debe contener sólo números y letras del alfabeto inglés, por lo que la expresión regular se verá así:

$a = "qwerty12345";

¿Qué personajes permitimos? Letras inglesas de cualquier caso y números. Ahora intenta dejar una línea en blanco en lugar de la contraseña.

$a = "";
if(preg_match("/+/",$a)) echo "La contraseña es correcta";

No verá el mensaje "La contraseña es correcta". ¿Por qué? Porque el metacarácter "+" verificó la cadena para ver si tenía al menos un carácter.

Y ahora un pequeño truco, echemos un vistazo a nuestra expresión, no permitimos, bueno, digamos un espacio en ella, ¿no? ponga un espacio al final de la contraseña y ejecute

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "La contraseña es correcta";

¿Y por qué vemos nuestro mensaje sobre la contraseña correcta? Es bastante simple... Función preg_match(); deja de comprobar en el primer partido. Es decir, el símbolo “q” se ajusta al patrón que describimos y todo lo demás ya no es importante para la función. ¿Qué debemos hacer? Aquí se explica cómo solucionarlo:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "La contraseña es correcta";

Al agregar un "^" al comienzo de una expresión y un "$" al final, le indicamos a la función con qué patrón debe coincidir. todo línea. Si ejecuta este código, no verá el mensaje, ya que hay un carácter ilegal al final de la contraseña: un espacio.

Ahora cambie el metacarácter "+" por el metacarácter "?". ¿Qué crees que pasará? Correctamente, no habrá ningún mensaje sobre la exactitud de la contraseña, ya que la contraseña contiene más de un carácter. Espero haber explicado adecuadamente el trabajo de estos tres metacaracteres de uso frecuente.

A veces "no" es mejor

Al menos hemos aprendido a comprobar que la contraseña es correcta, ¡y eso es bueno! Déjame hablarte de otra forma de buscar algo en una cadena. Digamos que necesitamos verificar la ausencia de números en una cadena. ¿Cómo hacer esto? Aquí está la línea:

(Introduje específicamente estos símbolos “-_+()” para que la vida no pareciera miel...) Podríamos formular la siguiente expresión:

Pero debes admitir que no siempre sabemos qué caracteres se usan en una línea, ¡pero sabemos con certeza que no debería haber números en ella! Por lo tanto, sería más lógico simplemente escribir una plantilla que omitiera líneas en las que No números, y no aquellos en los que hay "¡¡¡Dios mío, cuántos símbolos incomprensibles !!!". A continuación se muestra un ejemplo de una expresión compuesta correctamente para este tipo de problemas:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "¡Sin números!";

¿Cómo logramos esto? Hemos introducido el símbolo. ¡Pero! la mayúscula "^" ([^0-9]) colocada al principio indica que habrá no debería Espero que esto se haya solucionado

Bueno, terminemos lentamente... Daré dos ejemplos con explicaciones, durante los cuales aprenderemos cómo guardar el resultado de la búsqueda en una variable y cómo verificar que la dirección postal sea correcta.

¡Lo vi y lo guardé!

mi blog

$a = " mi blog";
preg_match("/ /", $a);

En nuestra expresión regular, describimos todos los caracteres posibles que se pueden incluir en un enlace. También quiero prestar atención a las comillas y los caracteres “/” en nuestra expresión. Están precedidos por una barra invertida, ¿para qué sirve? El hecho es que "/" y la comilla son en sí mismos caracteres especiales. Y para que la plantilla los perciba como símbolos ordinarios, debemos filtrarlos. El escape se realiza agregando una barra invertida antes de los caracteres especiales. espero que quede claro

$a = " mi blog";
preg_match("/ /", $a, $b);

Bueno, en consecuencia, es necesario agregar un parámetro adicional en forma de variable $b, en el que se almacenará el enlace encontrado. También necesita saber que el resultado de la búsqueda se coloca en una matriz. Por tanto, la variable $b es una matriz. La información que buscamos está bajo el índice 1. Esto significa que el resultado de la búsqueda está en la variable $b. Mostremos el resultado en la pantalla:

$a = " mi blog";
preg_match("/ /", $a, $b);
eco $b;

¡La dirección correcta es la clave del éxito!

Y por último, la respuesta a la pregunta ¿es correcto el correo electrónico? Primero, ¿necesita saber qué caracteres están permitidos en las direcciones? Hasta donde yo sé, los caracteres permitidos incluyen:

  • Letras en inglés, números, “_”, “-” ummmm todo parece ser... Partiremos de esto.
  • A continuación tenemos "@"
  • Después, letras inglesas.
  • Siguiente, punto
  • Y de nuevo letras inglesas...

Entonces la expresión regular será la siguiente:

$a = " [correo electrónico protegido]";
if(preg_match("/^+@+.+$/", $a)) echo "¡la dirección de correo electrónico es correcta!";
else echo "¡la dirección de correo electrónico NO está escrita correctamente!";

Bueno... espero que esos registros no te asusten ahora y que puedas comprenderlos perfectamente.

Por último, quiero decir algo. El artículo resultó engorroso y, al mismo tiempo, cubría sólo una parte de las posibilidades. Si estás leyendo esta frase, lo más probable es que la hayas leído hasta el final, por lo que muchas gracias.

Respecto a la serie de artículos sobre el desarrollo de un blog cms, la primera parte de la serie ¡Lo declaro cerrado! En un futuro próximo comenzaremos a implementar el panel de administración, así que no "cambies". Si tienes alguna pregunta, estaré encantado de responderte. ¡Todo lo mejor para ti, eso es todo de mi parte!

) Les mostré un ejemplo del uso de expresiones regulares para encontrar partes específicas del código fuente de una página. Ahora aprenderemos a escribirlos nosotros mismos. Esta habilidad le ayudará a escribir, limpiar texto de fragmentos innecesarios, buscar las partes necesarias en grandes volúmenes de texto, etc.

Este tema es bastante complicado, pero intentaré cubrir brevemente los más puntos importantes. No sé si tendré éxito, pero espero que la lección sea útil.
Entonces, comencemos con el hecho de que existen varias funciones para trabajar con expresiones regulares en PHP, pero las más utilizadas son tres:

  • preg_replace — busca y reemplaza texto que coincida con una expresión regular;
  • preg_match: solo una búsqueda normal;
  • preg_split: busca y divide texto.

Al menos, en lecciones anteriores los usamos. Más precisamente, en lugar de preg_match estaba preg_match_all, pero en esencia es lo mismo, sólo que este último no interrumpe la búsqueda después del primer hallazgo. Es decir, si usamos preg_match, no encontraremos todas las ocurrencias, sino solo la primera.

Elegir qué función utilizar en cada situación es bastante sencillo. Necesitamos reemplazar: usamos reemplazar, como en el caso en que necesitábamos eliminar partes innecesarias del código de la página, ¿recuerdas?

$página = preg_replace("/ ^]/i", "", $página); $página = preg_replace("/ ^]/i", "", $página); $página = str_replace("", "", $página);

El primer parámetro de la función es un carácter regular que determina lo que buscamos. El segundo es con qué lo reemplazamos. Tercero: ¿hacia dónde miramos? Por lo tanto, aquí tomamos la variable $page y le asignamos el resultado de la función preg_replace donde buscamos todos los tipos de entrada = casilla de verificación, así como las etiquetas de apertura y cierre. Los reemplazaron por ", es decir, simplemente los borraron. Espero que todo esté claro aquí. Pasaremos a analizar la expresión en sí (el primer parámetro de la función) un poco más adelante.
También hubo un ejemplo del uso de preg_match_all, que resultó útil para encontrar todos los enlaces en el texto restante. Entonces necesitábamos enlaces porque contenían las palabras clave que estábamos analizando. Esto es lo que pasó:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$página,$ok); para ($j=0; $j ".$ok[$j].""; }

El primer parámetro es nuevamente una expresión regular para encontrar todos los enlaces que están naturalmente encerrados en la etiqueta "a" (si no está familiarizado con el marcado HTML, lea). La segunda es una variable que contiene el texto que se buscará. El tercer parámetro es una variable en la que se coloca el resultado: $ok. Después de esto, todo lo que queda es revisar todos los elementos necesarios de $ok para obtener las capturas clave que necesitamos. Por otra parte, hay que decir que en la salida obtenemos una matriz multidimensional. Por eso lo mostramos de una forma tan compleja: $ok[$j]. Para ver la estructura de la matriz, use la función a continuación y comprenderá todo.

Print_r($ok);

Parece que hemos resuelto las funciones que utilizamos para nuestro trabajo. Ahora solo queda aprender a escribir estas mismas expresiones regulares, que son el primer parámetro de cada uno de estos métodos. Pasemos a lo más importante.

Cómo escribir oraciones regulares

Primero, veamos las estructuras básicas. Las expresiones tienen opciones. Se especifican con una letra y se escriben al final, precedidas de una barra.

Además, se admiten los siguientes metacaracteres:

Los metacaracteres, a su vez, pueden tener modificadores:

Bueno, ahora podemos pasar a analizar nuestros patrones habituales de la última lección. Basándonos en los signos anteriores, intentemos comprender lo que tenemos. Aquí está la expresión:

/^]/yo

La primera y la última barra “/” indican que hay una expresión regular dentro de ellas. Además, después del último ponemos “i”, esta es una opción, como en la primera tabla, no se tiene en cuenta el caso. Dentro de las barras se encuentra la secuencia regular en sí. Comienza con el signo menor que y la etiqueta de entrada, y todo lo que viene después hasta que el signo de punto es simplemente texto sin formato para buscar. Pero el punto en sí y los símbolos que lo siguen son más interesantes. En este caso, la construcción “.*?” significa cualquier secuencia de caracteres. Es decir, si combinamos solo texto y esta construcción, seleccionaremos todo el texto después de la primera aparición y hasta el final. Para detenerse, debe encontrar una etiqueta HTML de cierre "más que" o un carácter de nueva línea. Este diseño nos brinda esa oportunidad:

Los caracteres entre corchetes están conectados por un OR lógico. El final es el signo mayor que O el comienzo de la línea.
Esa es toda la expresión, en ella establecemos la condición inicial, la condición intermedia y la condición final. No es difícil, ¿verdad? Aquí hay una ilustración para mayor claridad:

Veamos una cosa más para solidificar todo. Buscamos enlaces con ellos:

/]+?>(.*?)<\/a>/uis

Leemos la expresión. Nuevamente, descartamos primero las barras y las opciones. Los indicadores "uis" se explican por sí mismos, excepto "u", que no describí; muestra que estamos usando codificación Unicode. No queda mucho. El inicio es la etiqueta "a", que se abre y luego viene la clase.

lo que significa NO mayor o menor que (abrir y cerrar etiquetas HTML), es decir, cualquier carácter en este caso. Se agrega “+?” a la clase, lo que significa que esta clase estará presente 1 o más veces (pero al menos 1 vez con seguridad). Y luego viene la etiqueta html de cierre para la etiqueta "a". Hay texto dentro del enlace especificado por el grupo.

Después de todo, no sabemos qué tipo de texto habrá allí, por lo que definimos dicho grupo. Y al final hay una etiqueta de cierre “a”:

Tenga en cuenta que utilizamos una barra invertida para escapar de la barra para que se perciba como texto simple.

Uf. El tema es realmente bastante complejo, requiere práctica. Quizás estoy haciendo algo que no es del todo óptimo y es posible crear otras expresiones regulares más correctas, pero soy tan autodidacta como tú, así que no juzgues estrictamente, comparte tus opciones en los comentarios. Además, si algo no te queda claro, la página de comentarios y contacto están a tu servicio.

Cuando trabajan con textos en cualquier lenguaje de programación moderno, los desarrolladores se enfrentan constantemente a las tareas de verificar que los datos ingresados ​​cumplan con el patrón deseado, buscar y reemplazar fragmentos de prueba y otras operaciones típicas para procesar información simbólica. Desarrollar algoritmos de verificación propios conlleva pérdida de tiempo, incompatibilidad del código del programa y complejidad en su desarrollo y modernización.

El rápido desarrollo de Internet y los lenguajes de desarrollo WEB requirió la creación de herramientas universales y compactas para procesar información textual con una cantidad mínima de código requerido para ello. El lenguaje PHP, popular entre principiantes y desarrolladores profesionales, no es una excepción. La expresión regular como lenguaje de plantilla de texto le permite simplificar las tareas de procesamiento de texto y reducir el código del programa en decenas y cientos de líneas. Muchos problemas no se pueden resolver sin él.

Expresiones regulares en PHP

El lenguaje PHP contiene tres mecanismos para trabajar con expresiones regulares: "ereg", "mb_ereg" y "preg". La más común es la interfaz "preg", cuyas funciones brindan acceso a la biblioteca de expresiones regulares PCRE, desarrollada originalmente para el lenguaje Perl, que se incluye con PHP. Las funciones preg buscan coincidencias en una cadena de texto determinada de acuerdo con un patrón específico en el lenguaje de expresiones regulares.

Conceptos básicos de sintaxis

Es imposible describir en detalle en un artículo breve toda la sintaxis de las expresiones regulares; existe literatura especial para ello. Presentamos solo los elementos principales para mostrar las amplias posibilidades para el desarrollador y comprender los ejemplos de código.

B se define formalmente de una manera muy compleja, así que simplifiquemos la descripción. Una expresión regular es una cadena de texto. Consta de un patrón delimitado y un modificador que indica cómo procesarlo. Es posible incluir varias alternativas y repeticiones en las plantillas.

Por ejemplo, en la expresión /\d(3)-\d(2)-\d(2)/m el separador será «/» , luego viene el patrón y el símbolo. "metro" será un modificador.

Todo el poder de las expresiones regulares está codificado mediante metacaracteres. El metacarácter principal del lenguaje es la barra invertida - "\". Invierte el tipo de carácter que le sigue (es decir, un carácter normal se convierte en un metacarácter y viceversa). Otro metacarácter importante es la barra diagonal "|", que especifica variaciones alternativas del patrón. Más ejemplos de metacaracteres:

PHP, al procesar expresiones regulares, trata el espacio como un carácter significativo separado, por lo que las expresiones ABCWHERE y ABCWHERE son diferentes.

Subpatrones

En PHP, los subpatrones regulares están separados por paréntesis y, a veces, se denominan "subexpresiones". Realizar las siguientes funciones:

    Destacando alternativas. Por ejemplo, plantilla calor(algo|pájaro|) coincide con las palabras "calor", "pájaro de fuego" Y "asar". Y sin los paréntesis sería simplemente una cadena vacía, “pájaro” y “asado”.

    Subpatrón "emocionante". Esto significa que si una subcadena coincide en el patrón, todas las coincidencias se devuelven como resultado. Para mayor claridad, demos un ejemplo. Dada la siguiente expresión regular: el ganador recibe((dorado|dorado)(medalla|copa)) - y una línea para encontrar coincidencias: "el ganador recibe una medalla de oro". Además de la frase original, el resultado de la búsqueda arrojará: "medalla de oro", "medalla", "oro".

Operadores de repetición (cuadrificadores)

Al escribir expresiones regulares, a menudo es necesario analizar repeticiones de números y símbolos. Esto no es un problema si no hay muchas repeticiones. ¿Pero qué hacer cuando no sabemos su número exacto? En este caso, debes utilizar metacaracteres especiales.

Para describir repeticiones, se utilizan cuadrificadores: metasímbolos para especificar la cantidad. Los cuadrificadores son de dos tipos:

  • general, entre paréntesis;
  • abreviado.

El cuantificador general especifica el número mínimo y máximo de repeticiones permitidas de un elemento, expresado como dos números entre llaves, así: x(2,5). Si se desconoce el número máximo de repeticiones, se omite el segundo argumento: x(2,).

Los cuantificadores taquigráficos representan símbolos de las repeticiones más comunes para evitar un desorden de sintaxis innecesario. Comúnmente se utilizan tres abreviaturas:

1. * - cero o más repeticiones, lo que equivale a (0,).

2. + - una o más repeticiones, es decir,).

3. ? - cero o solo una repetición - (0,1).

Ejemplos de expresiones regulares

Para quienes aprenden expresiones regulares, los ejemplos son el mejor tutorial. Presentaremos algunos que muestran sus amplias capacidades con un mínimo de esfuerzo. Todos los códigos del programa son totalmente compatibles con las versiones PHP 4.x y superiores. Para comprender completamente la sintaxis y utilizar todas las características del lenguaje, recomendamos el libro "Expresiones regulares" de J. Friedl, que analiza completamente la sintaxis y contiene ejemplos de expresiones regulares no solo en PHP, sino también en Python, Perl, MySQL, Java, Rubí y C#.

Comprobación de la exactitud de la dirección de correo electrónico

Tarea. Hay una página de Internet que solicita al visitante una dirección de correo electrónico. La expresión regular debe verificar que la dirección recibida sea correcta antes de enviar mensajes. El cheque no garantiza que el buzón especificado realmente exista y acepte cartas. Pero puede eliminar direcciones obviamente incorrectas.

Solución. Como ocurre con cualquier lenguaje de programación, las expresiones regulares de verificación de direcciones de correo electrónico se pueden implementar en PHP de diversas formas, y los ejemplos de este artículo no son el principio ni el fin de todo. Por lo tanto, en cada caso proporcionaremos una lista de requisitos que deben tenerse en cuenta a la hora de programar, y la implementación específica depende completamente del desarrollador.

Entonces, una expresión que verifica si un correo electrónico es válido debe verificar las siguientes condiciones:

  1. La presencia del símbolo @ en la cadena fuente y la ausencia de espacios.
  2. La parte del dominio de la dirección, seguida del símbolo @, contiene sólo caracteres válidos para nombres de dominio. Lo mismo se aplica al nombre de usuario.
  3. Al verificar un nombre de usuario, debe buscar caracteres especiales como un apóstrofo o Estos caracteres son potencialmente peligrosos y pueden usarse en ataques como la inyección SQL. Evite este tipo de direcciones.
  4. Los nombres de usuario solo permiten un punto, que no puede ser el primer ni el último carácter de la línea.
  5. El nombre de dominio debe contener al menos dos y no más de seis caracteres.

Un ejemplo que tiene en cuenta todas estas condiciones se puede ver a continuación en la figura.

Comprobar la validez de las URL

Tarea. Comprobar si una cadena de texto determinada es válida Una vez más, las expresiones regulares de comprobación de URL se pueden implementar de diversas formas.

Solución. Nuestra versión final se ve así:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Ahora veamos sus componentes con más detalle usando la figura.

Comprobación de números de tarjetas de crédito

Tarea. Es necesario comprobar la exactitud del número de tarjeta de plástico introducido para los sistemas de pago más habituales. Opción considerada solo para tarjetas

Solución. Al crear una expresión, debes tener en cuenta la posible presencia de espacios en el número ingresado. Los números de la tarjeta están divididos en grupos para facilitar la lectura y el dictado. Por lo tanto, es bastante natural que una persona intente ingresar el número de esta manera (es decir, usando espacios).

Escribir una expresión universal que tenga en cuenta posibles espacios y guiones es más difícil que simplemente descartar todos los caracteres excepto los números. Por lo tanto, se recomienda utilizar el metacarácter /D en la expresión, que elimina todos los caracteres excepto los números.

Ahora puede proceder directamente a verificar el número. Todas las compañías de tarjetas de crédito utilizan un formato de número único. El ejemplo utiliza esto y el cliente no necesita ingresar el nombre de la empresa; está determinado por el número. Las tarjetas Visa siempre comienzan con 4 y tienen una longitud numérica de 13 o 16 dígitos. MasterCard comienza en el rango 51-55 con una longitud numérica de 16. Como resultado, obtenemos la siguiente expresión:

Antes de procesar un pedido, puede realizar una verificación adicional del último dígito del número, que se calcula mediante el algoritmo de Luhn.

Comprobando números de teléfono

Tarea. Comprobando la exactitud del número de teléfono ingresado.

Solución. El número de dígitos de los números de teléfonos fijos y móviles varía significativamente de un país a otro, por lo que no es posible comprobar universalmente que un número de teléfono es correcto mediante expresiones regulares. Pero los números internacionales tienen un formato estricto y son excelentes para verificar plantillas. Además, cada vez más operadores telefónicos nacionales intentan cumplir con una norma única. La estructura del número es la siguiente:

+CCC.NNNNNNNNNNxEEEE, Dónde:

C es el código de país y consta de 1 a 3 dígitos.

N - número de hasta 14 dígitos.

E - extensión opcional.

El signo más es un elemento obligatorio y el signo x está presente sólo cuando es necesaria la expansión.

Como resultado, tenemos la siguiente expresión:

^\+(1,3)\.(4,14)(?:x.+)?$

Números en rango

Tarea. Debe hacer coincidir un número entero dentro de un rango específico. Además, es necesario que las expresiones regulares coincidan sólo con números de un rango de valores.

Solución. A continuación se muestran algunas expresiones para algunos de los casos más comunes:

Encontrar una dirección IP

Tarea. Debe determinar si la cadena proporcionada es una dirección IP válida en formato IPv4 en el rango 000.000.000.000-255.255.255.255.

Solución. Como ocurre con cualquier tarea en PHP, las expresiones regulares tienen muchas variaciones. Por ejemplo, esto:

Comprobación de expresiones en línea

Probar la corrección de las expresiones regulares puede resultar difícil para los nuevos programadores debido a la complejidad de la sintaxis, que difiere de los lenguajes de programación "normales". Para resolver este problema, existen muchos probadores de expresiones en línea que facilitan verificar la exactitud de la plantilla creada en texto real. El programador ingresa la expresión y los datos que se van a probar y ve instantáneamente el resultado del procesamiento. Por lo general, también hay una sección de referencia donde se describen en detalle expresiones regulares, ejemplos y diferencias de implementación para los lenguajes de programación más comunes.

Pero no se recomienda a todos los desarrolladores que utilicen PHP confiar completamente en los resultados de los servicios en línea. Una expresión regular, escrita y probada personalmente, mejora tu habilidad y garantiza la ausencia de errores.


Una de las características más poderosas y útiles del lenguaje PHP es su soporte para expresiones regulares. Muchos programadores, tanto principiantes como experimentados, se sienten intimidados por la aparente complejidad y complejidad del lenguaje de expresiones regulares. Pero te puedo asegurar que vale la pena. El uso de expresiones regulares simplifica enormemente el trabajo de procesamiento de textos y datos débilmente estructurados.


Las expresiones regulares son expresiones escritas en un lenguaje especial. No te alarmes, el idioma es bastante fácil de entender; todo lo que necesitas es experiencia y práctica.


Creo que te has encontrado repetidamente con situaciones en las que tienes texto (por ejemplo, en Microsoft Word) y necesitas encontrar algo importante en él. Si sabe exactamente lo que está buscando, todo es simple: abra el cuadro de diálogo de búsqueda, ingrese la palabra de búsqueda, presione el botón y listo, se encuentra el texto.


Pero, ¿qué harás si sólo sabes de antemano el tipo de información que buscas? Por ejemplo, se enfrenta a la tarea de encontrar todas las direcciones de correo electrónico en un documento de un par de cientos de hojas. Algunos verán el documento manualmente, otros ingresarán el perro (@) en la búsqueda y lo buscarán. De acuerdo: ambas opciones son un trabajo agotador e ingrato.

Aquí es donde las expresiones regulares vienen al rescate. En cierta medida, las expresiones regulares se pueden comparar con máscaras o plantillas que se superponen al texto: si el texto coincide con la máscara, entonces este es el fragmento deseado. Pero antes de considerar el uso de expresiones regulares, nos familiarizaremos con su sintaxis.

Una expresión regular es una cadena de texto compuesta según ciertas leyes y reglas. Una cadena consta de caracteres y grupos de caracteres, metacaracteres, cuantificadores y modificadores.

En este caso, por símbolos se entiende cualquier símbolo de cualquier alfabeto. Y no sólo los legibles. Puedes insertar fácilmente un carácter ilegible en una expresión; para ello, sólo necesitas conocer su código en formato hexadecimal. Por ejemplo:

// caracteres legibles a E // caracteres y códigos ilegibles \x41 - igual que la letra "A" \x09 - carácter de tabulación

Un grupo de caracteres son varios caracteres escritos secuencialmente:

ACZms promedio

Me gustaría llamar su atención de inmediato: el "espacio" en las expresiones regulares también se considera un carácter significativo, así que tenga cuidado al escribir expresiones. Por ejemplo, estos grupos de caracteres son expresiones DIFERENTES:

ABC DONDE ABC DONDE

El siguiente elemento del lenguaje son los metacaracteres. El prefijo "meta" significa que estos símbolos describen otros símbolos o sus grupos. La tabla describe los principales metacaracteres del lenguaje de expresiones regulares:

Metacaracteres para especificar caracteres especiales
() Paréntesis. Define expresiones anidadas.
| Metacarácter de selección
^ Metacarácter de inicio de línea
$ Metacarácter de fin de línea
\norte Carácter de avance de línea (código hexadecimal 0x0A)
\r Carácter de retorno de carro (código hexadecimal 0x0D)
\ t Carácter de tabulación (código hexadecimal 0x09)
\xhh Al insertar un carácter con código hexadecimal 0xhh, por ejemplo \x42, se insertará la letra latina "B"
Metacaracteres para especificar grupos de caracteres.
. Punto. Cualquier personaje.
\d Dígito (0-9)
\D No es un número (cualquier carácter excepto los caracteres del 0 al 9)
\s Carácter en blanco (normalmente espacio y tabulación)
\S Carácter no vacío (todos excepto los caracteres identificados por el metacarácter \s)
\w Un carácter de "diccionario" (un carácter que se utiliza en palabras. Normalmente todas las letras, todos los números y un guión bajo ("_"))
\W Todos excepto los caracteres definidos por el metacarácter \w

Los metacaracteres de la segunda mitad de la tabla son muy fáciles de recordar. "d" - dígito (dígito), "s" - símbolo (símbolo), "w" - palabra (palabra). Si la letra es grande, deberá agregar "NO" a la descripción del grupo.

Tomemos, por ejemplo, el texto "La camiseta roja tiene los números 1812 y la camiseta verde tiene los números 2009". Veamos ejemplos de las expresiones regulares más simples:

\d\d\d\d - encontrará 1812 y 2009 \D - encontrará todas las letras, espacios y signos de puntuación \s - encontrará todos los espacios en el texto.

Pero el año en nuestro ejemplo se puede escribir no en cuatro, sino en dos dígitos, las palabras pueden tener otras declinaciones, etc. Los subconjuntos de caracteres que se especifican mediante corchetes pueden ayudar aquí:

Significa cualquier dígito (igual que \d) - significa un dígito par - significa cualquier símbolo del alfabeto latino (en cualquier caso) o dígito.

Por ejemplo, la expresión \d\d\d en la cadena de prueba solo encontrará 1812, pero no 2009. Esta expresión debe leerse como "buscar todas las secuencias de cuatro dígitos donde el último dígito sea 0,2,4,6 o 8".

Lo único que nos queda por mencionar son los cuantificadores y modificadores.

Cuantificador Es una construcción especial que determina cuántas veces debe aparecer un personaje o grupo de personajes. El cuantificador está escrito entre llaves "()". Son posibles dos formatos de grabación: preciso y de alcance. Preciso el formato está escrito así:

Aquí X es el número de veces que se debe repetir el símbolo o grupo anterior. Por ejemplo la expresión

La segunda forma de registro es el rango. Registrado como

(X, Y) // o (,Y) // o (X,)

donde X es el mínimo e Y es el número máximo de repeticiones. Por ejemplo:

leerse como "de dos a cuatro dígitos escritos en secuencia". Si no se especifica uno de los límites, no se supone ninguna limitación. Por ejemplo:

\w(3,) - tres o más letras. \d(,5): no hay ningún número, o los hay, pero no más de cinco.

Los cuantificadores se pueden aplicar a un solo carácter o a un grupo:

[A-Yaa-ya](1,3)

Esta construcción seleccionará del texto todas las palabras rusas de una, dos o tres letras (por ejemplo, "o", "no", "yo", "voy", etc.)

Además de las llaves, hay tres metacaracteres cuantificadores más: “*” (asterisco), “+” (más) y “?” (pregunta). Se utilizan en los casos en los que se desconoce de antemano el número mínimo y máximo de repeticiones necesarias. Por ejemplo, al buscar direcciones de correo electrónico, no puede saber de antemano cuántos caracteres habrá en el nombre de usuario (antes de "perro") y cuántos habrá en el nombre de dominio (después de "perro").

El metacarácter "*" se lee como "cualquier cantidad desde cero o más", es decir diseño

define cualquier número de letras consecutivas, incluida su ausencia total.

El símbolo "+" se diferencia del asterisco únicamente en que requiere al menos un carácter. Aquellos. diseño

coincide con cualquier secuencia digital con uno o más dígitos.

Símbolo "?" coincide con la ausencia o presencia de un solo carácter. Aquellos. diseño

coincide con cualquier secuencia digital con uno o dos dígitos.

Aquí vale la pena mencionar una característica de los antiificadores "*" y "+" como codicia. La cuestión es que, por defecto, estos caracteres corresponden a la secuencia de caracteres más larga posible. Por ejemplo, para la línea "mamá lavó el marco", la expresión:

Elegiremos “mama Soap ra”, lo cual es algo inesperado, porque esperábamos obtener “ma”. Para cambiar este comportamiento, utilice el metacarácter "?" (signo de interrogación) escrito inmediatamente después del cuantificador. Limita el "apetito" de los cuantificadores al obligarlos a devolver la primera coincidencia en lugar de la más larga. Ahora cambiemos el ejemplo anterior:

y obtenga la coincidencia requerida "ma".

El último elemento del lenguaje es modificadores. Un modificador es un carácter especial que define los parámetros del "sistema" para analizar expresiones regulares. Solo existen cuatro símbolos de este tipo y se pueden utilizar de forma individual o simultánea:

i Habilita el modo que no distingue entre mayúsculas y minúsculas, es decir. Las letras mayúsculas y minúsculas en la expresión no difieren.
metro Indica que el texto que se busca debe considerarse como si consta de varias líneas. De forma predeterminada, el motor de expresiones regulares trata el texto como una sola cadena, independientemente de lo que realmente sea. En consecuencia, los metacaracteres "^" y "$" indican el principio y el final de todo el texto. Si se especifica este modificador, indicarán, respectivamente, el principio y el final de cada línea de texto.
s El metacarácter predeterminado es "." no incluye el carácter de nueva línea en su definición. Aquellos. para texto de varias líneas, la expresión /.+/ devolverá solo la primera línea, no todo el texto como se esperaba. Al especificar este modificador se elimina esta limitación.
Ud. Hace que todos los metacaracteres cuantitativos sean "no codiciosos" de forma predeterminada. En algunas modificaciones del lenguaje (en particular en PHP), en lugar de "U", se usa el carácter "g", que es más consistente con el significado ("g" es la abreviatura del inglés "greedy", "greedy" ).

La tabla muestra los ejemplos más populares y necesarios de expresiones regulares. Algunos de ellos pueden parecerle complicados y engorrosos, pero con un estudio detallado sin duda los comprenderá.

Expresiones regulares en PHP.

Existen funciones especiales para trabajar con expresiones regulares en PHP, cuya lista y una breve descripción se dan en la tabla:

int preg_match (patrón de cadena, asunto de cadena [, coincidencias de matriz])

La función comprueba si el contenido del tema coincide con el patrón. Devuelve 1 si se encuentran coincidencias; de lo contrario, devuelve 0. Si especifica el parámetro de matriz de coincidencias opcional, cuando se ejecute la función, se ingresará un solo elemento: la primera coincidencia encontrada.

"; print_r($encontrado); ?>

int preg_match_all (patrón de cadena, asunto de cadena, coincidencias de matriz [, orden int])
La función es idéntica a la anterior, con la única diferencia: busca en todo el texto y devuelve TODAS las coincidencias encontradas en la matriz de coincidencias.
preg_replace mixto (patrón mixto, reemplazo mixto, asunto mixto [, límite int])
Al igual que sus dos funciones predecesoras, preg_replace busca un fragmento de texto que coincida con un patrón. La función reemplaza todos los fragmentos encontrados con el texto especificado en los parámetros.Antes de limpiar:\n$texto\n\n"; $texto = preg_replace("/(\n \s(2,))/"," ",$texto); echo " Después de la limpieza:\n$text"; // ¿mostrará el texto libre de caracteres especiales // y espacios adicionales?>
preg_replace_callback mixto (patrón mixto, devolución de llamada mixta, asunto mixto [, límite int])
La función es una versión extendida de la anterior. La principal diferencia es que a esta función se le pasa en los parámetros el nombre de la función que analizará el texto y generará texto de reemplazo.
matriz preg_split (patrón de cadena, asunto de cadena [, límite int [, banderas int]])
Esta función es similar a las funciones explotar() y dividir(). Su peculiaridad es que el separador no es una cadena fija, sino una expresión regular. La función divide los datos de origen en elementos y los coloca en la matriz de salida.
matriz preg_grep (patrón de cadena, entrada de matriz)
La función está diseñada para búsquedas regulares en matrices. Para la búsqueda, se especifican una plantilla y una matriz de datos de entrada, y se devuelve una matriz que consta únicamente de elementos que coinciden con la plantilla.

La lista de funciones consideradas está lejos de ser completa, pero es suficiente para empezar con éxito a trabajar con expresiones regulares. Si está interesado en este tema, asegúrese de leer literatura adicional (por ejemplo, el libro de Friedl "Expresiones regulares"). Además, con fines de formación, recomiendo instalar uno de los programas especiales para probar expresiones regulares (por ejemplo, "PCRE" o "RegEx Builder").

1,6K

Expresiones regulares (abreviado como expresión regular) son secuencias de caracteres que forman patrones de búsqueda. Se utilizan principalmente en patrones de coincidencia de cadenas.

Breve historia

  • Todo comenzó entre los años 1940 y 1960, cuando mucha gente inteligente hablaba de expresiones regulares;
  • Años 70 g/re/p;
  • 1980 Perl y Henry Spencer;
  • 1997 PCRE (Expresiones regulares compatibles con Perl). Fue entonces cuando comenzó el auge de lo que llamamos expresiones regulares. PCRE proporciona bibliotecas para casi todos los idiomas.

Uso general de expresiones regulares en PHP

PHP incluye tres funciones principales para trabajar con PCRE: preg_match, preg_match_all y preg_replace.

Comparación de cumplimiento

La expresión devuelve 1 si se realiza una coincidencia, 0 en caso contrario y falso si se produce un error:

int preg_match (cadena $patrón, cadena $asunto [, matriz &$coincidencias [, int $banderas = 0 [, int $desplazamiento = 0 ]]])

Un ejemplo de una expresión regular que devuelve el número de coincidencias encontradas:

int preg_match_all (cadena $patrón, cadena $asunto [, matriz &$coincidencias [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Reemplazo

La expresión devuelve la cadena o matriz reemplazada ( basado en $ asunto):

preg_replace mixto ($patrón mixto, $reemplazo mixto, $sujeto mixto [, int $límite = -1 [, int $recuento ]])

Uso general de expresiones regulares en JavaScript

Las expresiones regulares en JavaScript tienen casi el mismo aspecto que en PHP.

Comparación de cumplimiento

Devuelve una matriz de coincidencias, o nula si no se encuentra ninguna coincidencia:

cadena.match(RegExp);

Reemplazo

Una expresión regular que devuelve una cadena con los reemplazos realizados:

string.replace(RegExp, reemplazo);

Características de las expresiones regulares en JavaScript.

  • Un punto nunca coincide con una nueva línea:
  • Los mismos métodos para comparar coincidencias y reemplazos mediante expresiones regulares que sin ellas.

Principios de composición de patrones de expresión regular.

Veamos un ejemplo en el que necesitamos encontrar direcciones de correo electrónico en una base de código. Nuestro objetivo:

Tomas analógicas

Las expresiones regulares constan de dos tipos de caracteres:

  • caracteres especiales: ? * + () () ^ $ / .
  • Literales.

Piense en las cadenas de entrada como pernos y en la plantilla como un conjunto de conectores para ellas (en el orden apropiado).

Caracteres especiales

Al probar expresiones regulares, necesita saber cómo funcionan los caracteres especiales:

  • El carácter de barra invertida \ puede reemplazar a otro carácter especial en una expresión regular:
  • Punto y w - .

Coincide con todos los caracteres excepto las nuevas líneas. Si desea verificar el cumplimiento de un punto, y solo un punto - , el cumplimiento de letras, números y guiones bajos - w

  • Corchetes.

Haga coincidir los caracteres dentro de paréntesis. Soporta gamas. Algunos ejemplos:
o - coincide con cualquier a, b o c.
o letras mayúsculas.
o cualquier número.
o - Coincide con cualquier carácter alfabético en minúscula o mayúscula.
¿Opcional? Coincide con 0 o 1.
Asterisco *.

Un asterisco indica 0 o más caracteres.

Combina 1 o más personajes.

Llaves ().

Valores mínimos y máximos. Algunos ejemplos de sintaxis de expresiones regulares:
o (1,) no menos de 1.
o (1,3) de 1 a 3.
o (1,64) de 1 a 64.

Agreguemos todo esto para obtener una expresión regular para direcciones de correo electrónico:

/+@+(.+)*/i


Así es como se ve en PHP:

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Usar expresiones regulares para la validación

Desafío: Garantizar que los datos de entrada sean los que esperamos. Objetivo 1: /[^w$.]/ Objetivo 2: /^(1,2)$/

Las expresiones regulares están bien para encontrar elementos, pero necesitas saber qué estás buscando exactamente.

¿Cuándo no deberías utilizar una expresión regular para la validación?

Muchos casos se manejan mejor usando la función PHP filter_var. Por ejemplo, la validación de la dirección de correo electrónico debe realizarse utilizando los filtros integrados de PHP:

var_filtro(" [correo electrónico protegido]", FILTER_VALIDATE_EMAIL)

Validación mediante expresiones regulares.

Las expresiones regulares al final de una línea utilizan anclajes:

^ - indica el comienzo de una línea.
$ es un signo de dólar que indica el final de una línea.

if (!preg_match("%^(1,2)$%", $_POST["subscription_frequency"])) ( $isError = true; )

Clases de personajes excluidas

[^abc] - todo excepto a, b o c, incluidas las nuevas líneas.

Un ejemplo que le permite ingresar solo caracteres alfanuméricos, guiones, puntos y guiones bajos:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) ( $isError = true; )

Buscar y reemplazar

Las funciones PCRE más comunes para realizar búsquedas y reemplazos son preg_replace() y preg_replace_callback() . Pero también existen preg_filter() y preg_replace_callback_array() que hacen casi lo mismo. Tenga en cuenta que la función preg_replace_callback_array() ha estado disponible desde PHP7.

Reemplazar palabras en una lista

$subject = "Quiero comer algunas manzanas."; echo preg_replace("/manzana|plátano|naranja/", "fruta", $asunto);

Resultado

Quiero comer algunas frutas.

Si una expresión regular tiene subpatrones ( entre paréntesis), puede reemplazar $N o N (donde N es un número entero >= 1), esto se llama "vínculo de retroceso".

Reorganizar dos números

$asunto = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $sujeto);

Resultado

Cambiar formato de fecha

$asunto = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $sujeto);

Resultado

Un ejemplo sencillo de sustitución de una URL en una etiqueta

$subject = "Visite https://php.earth/doc para obtener más artículos."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $sujeto) ;

Resultado