terça-feira, 27 de setembro de 2011

Expressões Regulares


^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Faz todo o sentido do antigo Egito hieróglifos para você, embora essas imagens pouco, pelo menos, parecem ter significado. Mas isso ... isso parece sem sentido. O que significa? Significa oleomarg32@hotmail.com , Fiery.Rebel @ veneuser.info , robustlamp + selfmag@gmail.ca , 



ou quase qualquer outro endereço de email simples, porque este é um padrão escrito em uma linguagem que descreve como correspondência de texto em strings. Quando você está olhando para ir além partidas de texto em linha reta, como encontrar "stud" em "mostarda" (que seria um fracasso btw), e você precisa uma maneira de "explicar" o que você está procurando, porque cada instância pode ser diferente, você veio com a necessidade Expressões Regulares, carinhosamente chamado regex.
Introdução à Regex Notation
Para obter seus pés molhados, vamos dar o exemplo acima e decompô-lo pedaço por pedaço.


^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $


O início de uma linha pode ser detectado semelhante a retornos de carro, mesmo que ele não é realmente um personagem invisível. Usando ^ diz o motor regex que o jogo deve começar no início da linha.


^ [A-Za-z 0-9-_. +% ] + @ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Em vez de especificar cada um e cada personagem do alfabeto, temos um atalho que dá um intervalo. Geralmente é case sensitive então você tem que especificar os faixa em letras maiúsculas e minúsculas.


^ [ A-Za-z 0-9 -_.+% ] + @ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


O mesmo vale para números ; podemos simplesmente abreviá-los para um intervalo em vez de escrever todos os 10 dígitos.


^ [ A-Za-z0-9 -_.+%] + @ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Estes são os caracteres especiais que está permitindo: um traço, sublinhado, ponto, sinal de mais, e símbolo de percentagem.


^ [ A-Za-z0-9-_. +% ] + @ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Os colchetes em torno nossas gamas de forma eficaz levar tudo que você colocou entre eles para criar o seu curinga personalizado. Nosso "curinga" é capaz de igualar qualquer letra AZ em maiúsculas ou minúsculas, um 0-9 dígitos, ou um de nossos caracteres de pontuação especial.


^ [A-Za-z0-9-_ +%.] + @ + \ [A-Za-z] {2,4} $ [A-Za-z0-9.].


Este é um quantificador, que modifica quantas vezes o caractere anterior deve corresponder, neste caso, o caractere anterior é o conjunto entre colchetes. + significa "pelo menos um", então no nosso exemplo, após o cruzamento do início da cadeia, temos que ter pelo menos um dos personagens dentro dos colchetes.
Neste ponto podemos combinar (dado os endereços de e-mail amostra anterior) oleomarg23 , Fiery.Rebel e robustlamp + selfmag . Algo como @ SodaCanDrive.com falharia porque nós deve ter pelo menos um dos caracteres no conjunto de colchetes no início do texto.
Além de + como um quantificador, existe * o que é quase idênticas, exceto que ele irá corresponder se não houver partidas em tudo. Se substituído o primeiro + quantificador na amostra com * e tinha isto:


^ [A-Za-z0-9-_ .+%]* @ [A-Za-z0-9.] + \. [A-Za-z] {2,4}


teria combinado com sucesso a string @ SodaCanDrive.com como estamos efetivamente falando o motor regex para manter correspondência até que se depara com um personagem não no conjunto, mesmo se não houver nenhum.


De volta ao nosso padrão original ...


^ [A-Za-z0-9-_ .+%]+ @ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


A @ partidas, literalmente, de forma nós agora temos acompanhado oleomarg23 @ , @ Fiery.Rebel e robustlamp + selfmag @ . O texto greencandelabra.com falha porque ele não tem um sinal de arroba!


^ [A-Za-z0-9-_ .+%]+ [A-Za-z0-9.] + \. [A-Za-z] {2,4} $


porção Este da expressão é semelhante ao que nós combinamos antes da arroba-só que desta vez não estamos permitindo que o sublinhado, mais o sinal, ou símbolo de percentagem. Agora nós estamos mais só combinar até gnarly3.1415 pie @ .


^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Aqui nós temos um ponto escapou , de modo a combiná-lo literalmente. Observe o sinal de mais pareados, literalmente, quando estava dentro de parênteses, mas fora dela tinha um significado especial como um quantificador. Fora dos parênteses, o ponto tem que ser escapado ou ele vai ser tratado como o caractere curinga; dentro dos colchetes, um ponto significa um ponto.


Uh oh! Uma vez que já combinava com a com. , . info e . ca , afigura-se como o jogo seria um fracasso, porque não temos mais pontos. Mas regex é inteligente: o motor de correspondência tenta recuar para encontrar o jogo. Então, agora estamos de volta para oleomarg23 @ hotmail. , Fiery.Rebel @ veneuser. e robustlamp + selfmag @ gmail. .
Neste ponto, gnargly3.1415 @ pie_a_la_mode.com falha porque o caractere após o que é correspondência até o momento não é um ponto. drnddog@chewwed.legs.onchair continua como drnddog@chewwed.legs. .


^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $


Lembre-se como nós fizemos a nossa própria curinga personalizado usando suportes? Podemos fazer uma coisa semelhante com o aparelho para fazer quantificadores personalizado. {2,4} meios para corresponder a pelo menos duas vezes, mas não mais do que quatro vezes. Se só queria corresponder exatamente duas vezes, gostaríamos de escrever {2} . Poderíamos lidar com qualquer quantidade até um máximo de quatro com {0,4} . {2} corresponderia a um mínimo de dois.


{2,4} é o nosso quantificador especial que limita a última partida curinga para qualquer 2, 3 ou 4 letras ou pontos. Nós quase totalmente para trás vai mais para drnddog@chewwed.legs para fazer o jogo.
Só temos mais um para ir ...


^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $


$ é a parte contra- a ^ . Assim como ^ faz para o início da linha, $ âncoras a partida até o fim da linha. Todos os nossos exemplos jogo agora, e drnddog@chewwed.legs.onchair falha porque não há 2, 3, ou 4 cartas precedido por um ponto no final da string.
RegExs em PHP


É tudo muito bom ter esta compreensão básica da notação usada por expressões regulares, mas ainda precisamos de saber como aplicá-la no contexto do PHP para realmente fazer algo produtivo, então vamos olhar para a função preg_match () , preg_replace () e preg_match_all () .
preg_match ()


Para validar um campo de formulário para um endereço de e-mail, usaríamos preg_match () :


<? Php
se (preg_match ( '/ ^ [A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4} $ / ' ,
    $ _POST [ "emailAddy" ])) {
    echo "Endereço de email aceita" ;
}
mais {
    echo "Email é todo quebrado." ;
}


Se for encontrada uma correspondência, preg_match () retorna 1, senão 0. Repare que nós adicionamos barras para o início eo fim do regex. Estes são usados ​​como delimitadores para mostrar a função onde a expressão regular começa e termina. Você pode perguntar: "Mas Jason, não é isso que as aspas são para?" Deixe-me garantir-vos que não há mais do que isso, como vou explicar em breve.
preg_replace ()


Para encontrar um endereço de e-mail e adicionar formatação, poderíamos usar preg_replace () :
<? Php
$ FormattedBlock = preg_replace (
    '/ ([A-Za-z0-9-_ .+%]+@[ A-Za-z0-9.] + \. [A-Za-z] {2,4}) / U' ,
    "<b> \ \ 1 </ b>" , $ blockOText );


Aqui está a explicação que foi prometido: colocamos um U após o delimitador de fechamento como uma bandeira que modifica a forma como os jogos regex. Vimos como jogos regex são gananciosos, devorando quantos caracteres ele pode e só backtracking se tiver que. U faz com que a regex "não-gananciosos." Sem ele, a seqüência de tweedle@dee.com-and-tweedle @ dum.com corresponderia como um só. Mas, tornando-un-gananciosos, nós dizemos a ele para encontrar o menor padrão de correspondência ... apenas tweedle@dee.com .
Você notou que também envolveu a expressão toda entre parênteses? Isso faz com que o motor regex para capturar uma cópia do texto que corresponde à expressão entre parêntesis que podemos referência com um back-referência ( \ 1 ). 
O segundo argumento para preg_replace () está dizendo a função para substituir o texto com uma tag de abertura em negrito, o que correspondeu ao padrão entre o primeiro conjunto de parênteses, e uma tag de fechamento em negrito. Se não houvesse outros conjuntos de parênteses, eles poderiam ser referenciado com \ 2 , \ 3 , etc dependendo de sua posição.
preg_match_all ()


Para digitalizar um texto e extrair uma matriz de todos os endereços de e-mail encontrado nele, preg_match_all () é a nossa melhor escolha:


<? Php
$ MatchesFound = preg_match_all (
    '/ ([A-z0-9-_ .+%]+@[ a-z0-9.] + \. [Az] {2,4}) / Ui " ,
    $ ArticleWithEmailAddys , listOfEmails $ );
se ( $ matchesFound ) {
    foreach ( $ listOfEmails [0] como $ foundEmail ) {
        echo $ found_email . "<br/>" ;
    }
}


preg_match_all () retorna o número de partidas que encontrou, e varas esses jogos na variável de referência que fornecemos como o terceiro argumento. Ele realmente cria um array multi-dimensional em que os jogos que estamos procurando são encontrados no índice 0.
Além do U modificador, desde que i que instrui o motor regex queremos que o padrão a ser aplicada de forma case-insensitive. Isto é, / a / i corresponderia ambos os casos inferior um A e um caso superior-A (ou / A / i funcionaria igualmente bem para que o assunto já que o modificador está pedindo o motor a ser caso agnóstico). Isso nos permite escrever coisas como [a-z0-9] na nossa expressão agora em vez de [A-Za-z0-9] o que o torna um pouco mais curto e mais fácil de grok.
Bem que cerca de quebra as coisas. Embora haja muito mais você pode fazer usando expressões regulares envolvendo olhar em frente, olhar-behind, e os exemplos mais intrincada de back-references, que você pode encontrar na documentação online do PHP, espero que você tenha muito o que trabalhar com que servir para muitos scripts apenas a partir deste artigo.

Nenhum comentário :

Postar um comentário

Total de visualizações de página