O texto original em inglês vem da Smashing Magazine . Traduzido por Benhuoer . Por favor indique a fonte ao reimprimir.
Expressões regulares (Expressão Regular, abrev. regex) são poderosas e podem ser usadas para localizar as informações necessárias em uma grande sequência de caracteres. Ele usa expressões convencionais de estrutura de caracteres para funcionar. Infelizmente, expressões regulares simples não são poderosas o suficiente para alguns aplicativos avançados. Se a estrutura de filtragem for mais complexa, talvez seja necessário usar expressões regulares avançadas.
Este artigo apresenta técnicas avançadas de expressões regulares. Selecionamos oito conceitos comumente usados e os analisamos com exemplos. Cada exemplo é uma maneira simples de escrever para atender a certos requisitos complexos. Se você ainda não entende os conceitos básicos de regularização, leia primeiro este artigo, este tutorial ou a entrada do Wiki.
A sintaxe regular aqui é adequada para PHP e compatível com Perl.
1. Ganância/preguiça
Todos os operadores regulares que podem ser qualificados várias vezes são gananciosos. Eles correspondem ao máximo possível da string de destino, o que significa que o resultado da correspondência será o maior possível. Infelizmente, essa abordagem nem sempre é o que desejamos. Portanto, adicionamos o qualificador "preguiçoso" para resolver o problema. Adicionar "?" após cada operador ganancioso faz com que a expressão corresponda apenas ao comprimento mais curto possível. Além disso, o modificador "U" também pode tornar preguiçosos os operadores que podem ser qualificados várias vezes. Compreender a diferença entre ganancioso e preguiçoso é a base para o uso de expressões regulares avançadas.
operador ganancioso
O operador * corresponde à expressão anterior zero ou mais vezes. É um operador ganancioso. Por favor, veja o seguinte exemplo:
preg_match( '/<h1>.*< /h1>/', '</h1><h1>Este é um título.</h1>
<h1>Este é outro. </h1>', $correspondências);
O ponto (.) pode representar qualquer caractere, exceto caracteres de nova linha. A expressão regular acima corresponde à tag h1 e a tudo dentro da tag. Ele usa pontos (.) e asteriscos (*) para corresponder a tudo dentro da tag. Os resultados correspondentes são os seguintes:
<h1>Este é um título. </h1>
<h1>Este é outro. </h1>
A string inteira é retornada. O operador * corresponderá a tudo em uma linha - até mesmo a tag de fechamento h1 no meio. Por ser ganancioso, combinar toda a sequência está de acordo com seu princípio de maximização de interesses.
operador preguiçoso
Modifique ligeiramente a fórmula acima e adicione um ponto de interrogação (?) para tornar a expressão preguiçosa:
/<h1>.*?< /h1>/</h1>
Dessa forma, parecerá que só precisa corresponder à primeira tag final h1 para concluir a tarefa.
Outro operador ganancioso com propriedades semelhantes é {n,}. Isso significa que o padrão de correspondência anterior será repetido n vezes ou mais. Se nenhum ponto de interrogação for adicionado, ele procurará tantas repetições quanto possível. Se for adicionado, será repetido o mínimo possível (é claro, "repetir". n vezes" é o mínimo).
#Criar sequência
$str = 'hihihi opa oi';
# Use o operador ganancioso {n,} para correspondência
preg_match( '/(oi){2,}/', $str, $matches );
# Use o operador degradado {n,} para corresponder
preg_match( '/(oi){2,}?/', $str, $matches );
Fonte: trabalho estúpido