El texto original en inglés procede de Smashing Magazine . Traducido por Benhuoer . Indique la fuente al reimprimir.
Las expresiones regulares (Expresión regular, abreviatura regex) son poderosas y pueden usarse para encontrar la información requerida en una gran cadena de caracteres. Utiliza expresiones de estructura de caracteres convencionales para funcionar. Desafortunadamente, las expresiones regulares simples no son lo suficientemente potentes para algunas aplicaciones avanzadas. Si la estructura de filtrado es más compleja, es posible que necesite utilizar expresiones regulares avanzadas.
Este artículo le presenta técnicas avanzadas de expresiones regulares. Hemos seleccionado ocho conceptos de uso común y los analizamos con ejemplos. Cada ejemplo es una forma sencilla de escribir para cumplir con ciertos requisitos complejos. Si aún no comprende los conceptos básicos de la regularización, lea primero este artículo, este tutorial o la entrada Wiki.
La sintaxis habitual aquí es adecuada para PHP y es compatible con Perl.
1. Avaricia/Pereza
Todos los operadores habituales que pueden calificarse varias veces son codiciosos. Coinciden con la mayor cantidad posible de la cadena objetivo, lo que significa que el resultado de la coincidencia será lo más largo posible. Desafortunadamente, este enfoque no siempre es lo que queremos. Por lo tanto, agregamos el calificador "vago" para resolver el problema. Agregar "?" después de cada operador codicioso hace que la expresión coincida solo con la longitud más corta posible. Además, el modificador "U" también puede hacer perezosos a los operadores que pueden calificarse varias veces. Comprender la diferencia entre codiciosos y perezosos es la base para utilizar expresiones regulares avanzadas.
operador codicioso
El operador * coincide con la expresión anterior cero o más veces. Es un operador codicioso. Consulte el siguiente ejemplo:
preg_match( '/<h1>.*< /h1>/', '</h1><h1>Este es un título.</h1>
<h1>Este es otro. </h1>', $coincidencias );
El punto (.) puede representar cualquier carácter excepto los de nueva línea. La expresión regular anterior coincide con la etiqueta h1 y todo lo que esté dentro de la etiqueta. Utiliza puntos (.) y asteriscos (*) para hacer coincidir todo lo que está dentro de la etiqueta. Los resultados coincidentes son los siguientes:
<h1>Este es un título. </h1>
<h1>Este es otro. </h1>
Se devuelve la cadena completa. El operador * coincidirá con todo lo que esté en una fila, incluso con la etiqueta h1 de cierre en el medio. Debido a que es codicioso, hacer coincidir toda la cadena está en línea con su principio de maximizar los intereses.
operador perezoso
Modifique ligeramente la fórmula anterior y agregue un signo de interrogación (?) para que la expresión sea vaga:
/<h1>.*?< /h1>/</h1>
De esta manera, sentirá que solo necesita coincidir con la primera etiqueta final h1 para completar la tarea.
Otro operador codicioso con propiedades similares es {n,}. Significa que el patrón coincidente anterior se repite n veces o más. Si no se agrega ningún signo de interrogación, buscará tantas repeticiones como sea posible. Si se agrega, se repetirá lo menos posible (por supuesto, "repetir). n veces" es el mínimo).
#Crear cadena
$cadena = 'hihihi, ups hola';
# Utilice el operador codicioso {n,} para hacer coincidir
preg_match( '/(hola){2,}/', $cadena, $matches ); # coincidencias[0] será 'hola'
# ¿Usar el operador degradado {n,}?
preg_match( '/(hola){2,}?/', $cadena, $matches ); # coincidencias[0] será 'hola'
Fuente: trabajo estúpido