PHP (expressão regular) - o que é isso? Exemplos e testes de expressões regulares. Expressões regulares (padrões)

) Mostrei um exemplo de uso de expressões regulares para encontrar partes específicas do código-fonte de uma página. Agora aprenderemos como escrevê-los nós mesmos. Essa habilidade o ajudará a escrever, limpar texto de fragmentos desnecessários, procurar as partes necessárias em grandes volumes de texto e assim por diante.

Este tópico é bastante complicado, mas tentarei abordar brevemente os pontos mais importantes. Não sei até que ponto terei sucesso, mas espero que a lição seja útil.
Então, vamos começar com o fato de que existem várias funções para trabalhar com expressões regulares em PHP, mas três são as mais usadas:

  • preg_replace — pesquisa e substitui texto que corresponda a uma expressão regular;
  • preg_match - apenas uma pesquisa normal;
  • preg_split - pesquisa e divide texto.

Pelo menos, nas lições anteriores nós os usamos. Mais precisamente, em vez de preg_match havia preg_match_all, mas é essencialmente a mesma coisa, só que este último não interrompe a busca após a primeira descoberta. Ou seja, se utilizarmos preg_match, não encontraremos todas as ocorrências, mas apenas a primeira.

Escolher qual função usar em qual situação é bastante simples. Precisamos substituir - usamos substituir, como no caso em que precisávamos remover partes desnecessárias do código da página, lembra?

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

O primeiro parâmetro da função é um caractere regular que determina o que procuramos. O segundo é o que o substituímos. Terceiro – Para onde estamos olhando? Portanto, aqui pegamos a variável $page e atribuímos a ela o resultado da função preg_replace onde procuramos todas as entradas type=checkbox, bem como rótulos de abertura e fechamento. Eles os substituíram por ", ou seja, simplesmente os apagaram. Espero que tudo esteja claro aqui. Passaremos à análise da própria expressão (o primeiro parâmetro da função) um pouco mais tarde.
Houve também um exemplo de uso de preg_match_all, que foi útil para localizar todos os links no texto restante. Precisávamos de links porque eles continham palavras-chave, que analisamos. Aqui está o que aconteceu:

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

O primeiro parâmetro é novamente uma expressão regular para encontrar todos os links que estão naturalmente incluídos na tag “a” (se você não estiver familiarizado com a marcação html, leia). A segunda é uma variável que contém o texto que será pesquisado. O terceiro parâmetro é uma variável na qual o resultado é colocado - $ok. Depois disso, tudo o que resta é passar por todos os elementos necessários de $ok para obter as chaves que precisamos. Separadamente, deve-se dizer que na saída obtemos um array multidimensional. É por isso que o exibimos de uma forma tão complexa: $ok[$j]. Para visualizar a estrutura do array, utilize a função abaixo e você entenderá tudo.

Imprimir_r($ok);

Parece que resolvemos as funções que usamos em nosso trabalho. Agora só falta aprender a escrever essas mesmas expressões regulares, que são o primeiro parâmetro de cada um desses métodos. Vamos passar para o mais importante.

Como escrever frases regulares

Primeiro, vejamos as estruturas básicas. Expressões têm opções. Eles são especificados por uma letra e escritos no final, precedidos por uma barra.

Além disso, os seguintes metacaracteres são suportados:

Os metacaracteres, por sua vez, podem ter modificadores:

Bem, agora podemos analisar os nossos padrões regulares da última lição. Com base nos sinais acima, vamos tentar entender o que temos. Aqui está a expressão:

/^]/eu

A primeira e a última barra “/” indicam que existe uma expressão regular dentro delas. Ao mesmo tempo, após a última colocamos “i”, esta é uma opção, como na primeira tabela - não leve em consideração o caso. Dentro das barras está a própria sequência regular. Ele começa com o sinal de menor que e a tag de entrada, e tudo o que vem depois disso até o sinal de ponto final é apenas texto simples para procurar. Mas o ponto em si e os símbolos depois dele são mais interessantes. Neste caso, a construção “.*?” significa qualquer sequência de caracteres. Ou seja, se combinarmos apenas o texto e esta construção, selecionaremos todo o texto após a primeira ocorrência e até o final. Para parar, você precisa encontrar uma tag HTML de fechamento “mais que” ou um caractere de nova linha. Este design nos dá essa oportunidade:

Os caracteres entre colchetes são conectados por OR lógico. O final é o sinal de maior que OU o início da linha.
Essa é toda a expressão, nela definimos a condição inicial, a condição intermediária e a condição final. Não é difícil, certo? Aqui está uma ilustração para maior clareza:

Vejamos mais uma coisa para solidificar tudo. Procuramos links com eles:

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

Lemos a expressão. Novamente, descartamos barras e opções primeiro. Os sinalizadores "uis" são autoexplicativos, exceto "u", que não descrevi - mostra que estamos usando codificação Unicode. Não resta muito. O início é a tag "a", que abre, depois vem a aula

o que significa NÃO maior ou menor que (abrir e fechar tags HTML), ou seja, quaisquer caracteres neste caso. “+?” é adicionado à turma, o que significa que esta turma estará presente 1 ou mais vezes (mas pelo menos 1 vez com certeza). E então vem a tag html de fechamento da tag “a”. Há texto dentro do link especificado pelo grupo

Afinal, não sabemos que tipo de texto estará ali, então definimos tal grupo. E no final tem uma tag de fechamento “a”:

Observe que escapamos da barra usando uma barra invertida para que seja percebida como um texto simples.

Ufa. O tema é realmente bastante complexo, requer prática. Talvez eu esteja fazendo algo não muito ideal e seja possível criar outras expressões regulares mais corretas, mas sou tão autodidata quanto você, então não julgue estritamente, mas sim compartilhe suas opções nos comentários. Além disso, se algo não estiver claro, os comentários e a página de contato estão à sua disposição.


Um dos recursos muito poderosos e úteis da linguagem PHP é o suporte para expressões regulares. Muitos programadores, tanto iniciantes quanto experientes, ficam intimidados pela aparente complexidade e complexidade da linguagem de expressão regular. Mas posso garantir: vale a pena. O uso de expressões regulares simplifica muito o trabalho de processamento de textos e dados pouco estruturados.


Expressões regulares são expressões escritas em uma linguagem especial. Não se assuste, a linguagem é bastante fácil de entender; basta ter experiência e prática.


Acho que você já se deparou repetidamente com situações em que tem texto (por exemplo, no Microsoft Word) e precisa encontrar algo importante nele. Se você sabe exatamente o que está procurando, tudo é simples: acesse a caixa de diálogo de pesquisa, digite a palavra de pesquisa, pressione o botão e pronto - o texto foi encontrado.


Mas o que você fará se souber antecipadamente o tipo de informação que procura? Por exemplo, você se depara com a tarefa de encontrar todos os endereços de e-mail em um documento de algumas centenas de folhas. Alguns visualizarão o documento manualmente, outros inserirão o cachorro (@) na busca e procurarão por ele. Concordo - ambas as opções são um trabalho árduo e ingrato.

É aqui que as expressões regulares vêm em socorro. Até certo ponto, as expressões regulares podem ser comparadas a máscaras ou modelos sobrepostos ao texto: se o texto corresponder à máscara, então este é o fragmento desejado. Mas antes de considerarmos o uso de expressões regulares, nos familiarizaremos com sua sintaxe.

Uma expressão regular é uma sequência de texto composta de acordo com certas leis e regras. Uma string consiste em caracteres e grupos de caracteres, metacaracteres, quantificadores e modificadores.

Neste caso, símbolos significam quaisquer símbolos de qualquer alfabeto. E não apenas legíveis. Você pode inserir facilmente um caractere ilegível em uma expressão; para fazer isso, basta conhecer seu código em formato hexadecimal. Por exemplo:

// caracteres legíveis a E // caracteres e códigos ilegíveis \x41 - o mesmo que a letra "A" \x09 - caractere de tabulação

Um grupo de caracteres consiste em vários caracteres escritos sequencialmente:

ACZms médios

Gostaria de chamar a atenção desde já - o “espaço” nas expressões regulares também é considerado um caractere significativo, por isso tome cuidado ao escrever expressões. Por exemplo, estes grupos de caracteres são expressões DIFERENTES:

ABC ONDE ABC ONDE

O próximo elemento da linguagem são os metacaracteres. O prefixo "meta" significa que esses símbolos descrevem alguns outros símbolos ou seus grupos. A tabela descreve os principais metacaracteres da linguagem de expressões regulares:

Metacaracteres para especificar caracteres especiais
() Colchetes. Define expressões aninhadas.
| Metacaractere de seleção
^ Metacaractere de início de linha
$ Metacaractere de fim de linha
\n Caractere de alimentação de linha (código hexadecimal 0x0A)
\r Caractere de retorno de carro (código hexadecimal 0x0D)
\t Caractere de tabulação (código hexadecimal 0x09)
\xhhh Inserir um caractere com código hexadecimal 0xhh, por exemplo \x42 inserirá a letra latina "B"
Metacaracteres para especificar grupos de caracteres
. Ponto. Qualquer personagem.
\d Dígito (0-9)
\D Não é um número (qualquer caractere, exceto caracteres de 0 a 9)
\s Caractere em branco (geralmente espaço e tabulação)
\S Caractere não vazio (todos exceto caracteres identificados pelo metacaractere \s)
\c Um caractere de "dicionário" (um caractere usado em palavras. Normalmente, todas as letras, todos os números e um sublinhado ("_"))
\C Todos, exceto caracteres definidos pelo metacaractere \w

Os metacaracteres da segunda metade da tabela são muito fáceis de lembrar. "d" - dígito (dígito), "s" - símbolo (símbolo), "w" - palavra (palavra). Se a letra for grande, você precisará adicionar “NÃO” à descrição do grupo.

Tomemos por exemplo o texto “A camisa vermelha tem os números 1812, e a camisa verde tem os números 2009”. Vejamos exemplos das expressões regulares mais simples:

\d\d\d\d - encontrará 1812 e 2009 \D - encontrará todas as letras, espaços e sinais de pontuação \s - encontrará todos os espaços no texto.

Mas o ano em nosso exemplo pode ser escrito não em quatro, mas em dois dígitos, as palavras podem ter outras declinações, etc. Subconjuntos de caracteres especificados usando colchetes podem ajudar aqui:

Significa qualquer dígito (igual a \d) - significa um dígito par - significa qualquer símbolo do alfabeto latino (em qualquer caso) ou dígito.

Por exemplo, a expressão \d\d\d na string de teste encontrará apenas 1812, mas não 2009. Esta expressão deve ser lida como "encontre todas as sequências de quatro dígitos onde o último dígito é 0,2,4,6 ou 8".

Tudo o que resta mencionar são quantificadores e modificadores.

Quantificadoré uma construção especial que determina quantas vezes um personagem ou grupo de personagens deve aparecer. O quantificador é escrito entre chaves "()". São possíveis dois formatos de gravação: preciso e de alcance. Preciso o formato é escrito assim:

Aqui X é o número de vezes que o símbolo ou grupo anterior deve ser repetido. Por exemplo a expressão

A segunda forma de gravação é o alcance. Gravado como

(X, Y) // ou (,Y) // ou (X,)

onde X é o mínimo e Y é o número máximo de repetições. Por exemplo:

lido como "dois a quatro dígitos escritos em sequência". Se um dos limites não for especificado, nenhuma limitação será assumida. Por exemplo:

\w(3,) - três ou mais letras. \d(,5) - não existem números, ou existem, mas não mais que cinco.

Os quantificadores podem ser aplicados a um único caractere ou a um grupo:

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

Esta construção selecionará do texto todas as palavras russas de uma, duas ou três letras (por exemplo, “ou”, “não”, “eu”, “eu vou”, etc.)

Além das chaves, existem mais três metacaracteres quantificadores: “*” (asterisco), “+” (mais) e “?” (pergunta). Eles são usados ​​​​nos casos em que o número mínimo e máximo de repetições necessárias é desconhecido antecipadamente. Por exemplo, ao pesquisar endereços de e-mail, você não pode saber antecipadamente quantos caracteres estarão no nome de usuário (antes de “cachorro”) e quantos estarão no nome de domínio (depois de “cachorro”).

O metacaractere "*" é lido como "qualquer valor de zero ou mais", ou seja, projeto

define qualquer número de letras consecutivas, incluindo sua ausência completa.

O símbolo “+” difere de um asterisco apenas porque requer pelo menos um caractere. Aqueles. projeto

corresponde a qualquer sequência digital com um ou mais dígitos.

Símbolo "?" corresponde à ausência ou presença de um único caractere. Aqueles. projeto

corresponde a qualquer sequência digital com um ou dois dígitos.

Aqui vale a pena mencionar uma característica dos antiificadores “*” e “+” como ambição. A questão é que, por padrão, esses caracteres correspondem à sequência de caracteres mais longa possível. Por exemplo, para a linha “mamãe lavou a moldura” a expressão:

escolheremos “mama soap ra”, o que é um tanto inesperado, pois esperávamos obter “ma”. Para alterar esse comportamento, use o metacaractere "?" (ponto de interrogação) escrito imediatamente após o quantificador. Limita o “apetite” dos quantificadores, forçando-os a retornar a primeira correspondência em vez da mais longa. Agora vamos mudar o exemplo anterior:

e obtenha a correspondência necessária "ma".

O último elemento da linguagem é modificadores. Um modificador é um caractere especial que define os parâmetros do “sistema” para análise de expressões regulares. Existem apenas quatro desses símbolos, eles podem ser usados ​​individualmente ou simultaneamente:

eu Ativa o modo que não diferencia maiúsculas de minúsculas, ou seja, letras maiúsculas e minúsculas na expressão não diferem.
eu Indica que o texto pesquisado deve ser tratado como composto por múltiplas linhas. Por padrão, o mecanismo de expressões regulares trata o texto como uma única string, independentemente do que ele realmente seja. Assim, os metacaracteres “^” e “$” indicam o início e o fim de todo o texto. Se este modificador for especificado, eles indicarão o início e o fim de cada linha de texto, respectivamente.
é O metacaractere padrão é "." não inclui o caractere de nova linha em sua definição. Aqueles. para texto multilinha, a expressão /.+/ retornará apenas a primeira linha, e não o texto inteiro como esperado. A especificação desse modificador remove essa limitação.
você Torna todos os metacaracteres quantitativos "não gananciosos" por padrão. Em algumas modificações da linguagem (em particular em PHP), em vez de “U”, é utilizado o caractere “g”, que é mais consistente com o significado (“g” é a abreviatura de “greedy”, “greedy” em inglês ).

A tabela mostra os exemplos mais populares e necessários de expressões regulares. Alguns deles podem parecer complicados e complicados para você, mas com um estudo detalhado você sem dúvida entenderá.

Expressões regulares em PHP.

Existem funções especiais para trabalhar com expressões regulares em PHP, cuja lista e uma breve descrição são fornecidas na tabela:

int preg_match (padrão de string, assunto de string [, correspondências de array])

A função verifica se o conteúdo do assunto corresponde ao padrão padrão. Retorna 1 se correspondências forem encontradas, caso contrário, retorna 0. Se você especificar o parâmetro opcional da matriz de correspondências, quando a função for executada, um único elemento será inserido nela - a primeira correspondência encontrada.

"; print_r($encontrado); ?>

int preg_match_all (padrão de string, assunto de string, correspondências de matriz [, ordem int])
A função é idêntica à anterior, com a única diferença - ela pesquisa todo o texto e retorna TODAS as correspondências encontradas no array de correspondências.
misto preg_replace (padrão misto, substituição mista, assunto misto [, int limit])
Como ambas as funções predecessoras, preg_replace procura um trecho de texto que corresponda a um padrão. A função substitui todos os fragmentos encontrados pelo texto especificado nos parâmetros.Antes de limpar:\n$texto\n\n"; $texto = preg_replace("/(\n \s(2,))/"," ",$texto); echo " Após a limpeza:\n$text"; // exibirá texto sem caracteres especiais // e espaços extras?>
preg_replace_callback misto (padrão misto, retorno de chamada misto, assunto misto [, limite interno])
A função é uma versão estendida da anterior. A principal diferença é que nesta função é passado nos parâmetros o nome da função que irá analisar o texto e gerar o texto de substituição.
array preg_split (padrão de string, assunto de string [, int limit [, int flags]])
Esta função é semelhante às funções explode() e split(). Sua peculiaridade é que o separador não é uma string fixa, mas sim uma expressão regular. A função divide os dados de origem em elementos e os coloca na matriz de saída.
array preg_grep (padrão de string, entrada de array)
A função foi projetada para pesquisa regular em arrays. Para a pesquisa, um modelo e uma matriz de dados de entrada são especificados, e uma matriz é retornada consistindo apenas de elementos que correspondem ao modelo.

A lista de funções consideradas está longe de estar completa, mas é suficiente para começar a trabalhar com expressões regulares com sucesso. Se você estiver interessado neste tópico, não deixe de ler literatura adicional (por exemplo, o livro “Expressões Regulares” de Friedl). Além disso, para fins de treinamento, recomendo instalar um dos programas especiais para testar expressões regulares (por exemplo, "PCRE" ou "RegEx Builder").

Vamos começar explicando o que é uma expressão regular. Então me responda esta pergunta: existe um “e” na palavra “teste”? "Comer!" você diz. Aí te faço uma segunda pergunta, como você encontrou a letra “e” na palavra “teste”? A resposta é óbvia, pegamos o primeiro caractere, ou seja, “t” e comparamos com o que procuramos, ou seja, com “e”. Se não forem iguais, pegamos o segundo caractere, ou seja, “e”, e comparamos com o que procuramos, ou seja, “e”. Voilá! Uma correspondência foi encontrada. Resposta: A palavra "teste" contém a letra "e".

Agora me responda mais uma pergunta, onde está a expressão regular nesse exemplo? Espero que você tenha adivinhado que a expressão regular aqui é o que procuramos na palavra "teste". Ou seja, a letra “e” neste exemplo é uma expressão regular.

Para que servem as expressões regulares em PHP? Na minha prática, expressões regulares eram usadas, por exemplo, para determinar se um endereço de e-mail foi redigido corretamente. Essas expressões também são usadas para determinar a exatidão do nome de usuário e da senha. Usando expressões regulares, você pode encontrar o endereço em um link e salvá-lo. Há muitas coisas que você pode fazer. Ao analisar isso, você pode identificar a função principal das expressões regulares e duas funções secundárias. Função principal, esta é uma busca por correspondências em uma string. Os efeitos colaterais incluem salvar as correspondências encontradas e substituí-las.

Primeira expressão regular

Em teoria, entendemos como encontrar o caractere “e” na palavra “teste”, mas como isso é implementado na prática? Para usar expressões regulares em php, geralmente são usadas as seguintes funções:

preg_match("expressão regular (padrão)", "variável na qual a pesquisa é realizada", "Variável na qual o resultado da pesquisa é salvo (parâmetro opcional)"); - Função de correspondência
preg_replace("expressão regular (padrão)", "Como substituir a correspondência encontrada", "variável na qual a substituição é feita"); - Substituir função

Vamos começar a usar essas funções. Aqui está um exemplo de busca pelo caractere "e" na palavra "teste":

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

O código descreve a condição: se algo que corresponda ao padrão for encontrado na variável $a, então exiba a mensagem “encontrado!!” Como você deve ter notado, nosso template está localizado entre dois "/". Neste caso, o símbolo "/" simboliza o início e o fim do nosso padrão. Espero que isso esteja claro.

Tudo isso é interessante, claro... mas nosso template é bem simples, não acham? Afinal, raramente precisamos encontrar algum símbolo numa variável. Na maioria dos casos, precisamos encontrar muitos personagens, e também alguns desconhecidos. Como ser? Vamos definir um problema para nós mesmos e tentar resolvê-lo. Suponha que temos uma string composta por números e uma letra desconhecida em inglês

Como encontrar esta carta? Pode haver qualquer letra do alfabeto inglês, então como você pode identificá-la? Você mesmo respondeu sua pergunta, existe qualquer letra, ou seja, está na faixa de a a z. Você pode usar intervalos em expressões regulares. Se não sabemos qual caractere estamos procurando, mas temos certeza de que esse caractere é uma letra do alfabeto inglês, a entrada será a seguinte:

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

Observe que o intervalo está entre colchetes "[" "]". Tudo o que está entre colchetes é definido como um símbolo, neste caso o símbolo varia de a a z. Se precisarmos encontrar não uma letra, mas um número, a entrada será assim:

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

Também quero observar que as expressões regulares diferenciam maiúsculas de minúsculas, portanto os caracteres “A” e “a” são completamente diferentes, para pesquisar os dois caracteres, escreva assim:

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

Há também uma busca por letras russas, realizada da mesma forma que as inglesas:

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

Metacaracteres

Aprendemos como procurar um caracter desconhecido em uma string. O que fazer se precisarmos encontrar vários personagens? Os chamados metassímbolos vêm em socorro... Suponha que temos uma string com números e letras, como podemos descrevê-la no modelo? Você consegue fazer isso:

linha - 123a321
amostra -

Hmm... o modelo realmente corresponde à nossa string e, quando verificado quanto à conformidade, dará a tão esperada verdade! Mas é um disco meio complicado, não acha?

Veja como encurtá-lo:

linha - 123a321
amostra - *

Parece-me que é mais curto. Qual é o símbolo “*”? Este é o mesmo meta-símbolo, significa que o símbolo que descrevemos (ou seja, um símbolo que pode conter números de 0 a 9 ou letras do alfabeto inglês, de a a z) pode ser repetido indefinidamente, ou mais de uma vez. Sim Sim! Este meta-símbolo encontrará uma correspondência em uma variável vazia, pois mesmo a ausência do símbolo que descrevemos retornará verdadeiro! Lembre-se disso

Que outros metacaracteres existem?

Por exemplo, o metacaractere "+" É quase semelhante ao metacaractere "*", com uma pequena exceção. "*" retornará verdadeiro mesmo se não houver nenhum caractere, e "+" verificará a presença de pelo menos um caractere. Isto é, se uma linha requer a presença mínimo um caractere, use "+" em vez de "*"

O metacaractere "?" também é frequentemente usado. Isso significa que a linha não deve conter mais do que um caractere desejado. Deixe-me dar alguns exemplos para os dois últimos metacaracteres que descrevi.

Suponha que precisemos verificar se a senha do usuário está correta. Vamos pensar no que a senha do usuário deve conter? Bem, em primeiro lugar, deve ser pelo menos um personagem. Em segundo lugar, deve conter apenas números e letras do alfabeto inglês, portanto a expressão regular ficará assim:

$a = "qwerty12345";

Que personagens permitimos? Letras inglesas de qualquer caso e números. Agora tente deixar uma linha em branco em vez da senha.

$a = "";
if(preg_match("/+/",$a)) echo "A senha está correta";

Você não verá a mensagem “A senha está correta”. Por que? Porque o metacaractere "+" verificou a string para ver se ela tinha pelo menos um caractere.

E agora um pequeno truque, vamos dar uma olhada na nossa expressão, não permitimos, digamos, um espaço nela, certo? coloque um espaço no final da senha e execute

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "A senha está correta";

E por que vemos nossa mensagem sobre a senha correta? É bem simples... Função preg_match(); interrompe sua verificação na primeira partida. Ou seja, o símbolo “q” se enquadra no padrão que descrevemos e todo o resto não é mais importante para a função. Veja como consertar:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "A senha está correta";

Ao adicionar um "^" no início de uma expressão e um "$" no final, informamos à função qual padrão deve corresponder todos linha. Se você executar este código, não verá a mensagem, pois há um caractere ilegal no final da senha - um espaço

Agora mude o metacaractere “+” para o metacaractere “?”. O que você acha que acontecerá? Corretamente, não haverá mensagem sobre a exatidão da senha, pois a senha contém mais de um caractere. Espero ter explicado corretamente o trabalho desses três metacaracteres usados ​​com frequência

Às vezes “não” é melhor

Pelo menos aprendemos como verificar se a senha está correta, e isso é bom! Deixe-me falar sobre outra maneira de procurar algo em uma string. Digamos que precisamos verificar a ausência de números em uma string. Como fazer isso? Aqui está a linha:

(Eu introduzi especificamente esses símbolos “-_+()” nele para que a vida não parecesse um mel...) Poderíamos formular a seguinte expressão:

Mas você deve admitir, nem sempre sabemos quais caracteres são usados ​​em uma linha, mas sabemos com certeza que não deveria haver números nela! Seria, portanto, mais lógico simplesmente escrever um modelo que pulasse as linhas nas quais Não números, e não aqueles em que há "Oh meu Deus, quantos símbolos incompreensíveis!!!". Aqui está um exemplo de uma expressão composta corretamente para tais problemas:

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

Como conseguimos isso? Entramos no símbolo Mas! a tampa "^" ([^0-9]) colocada no início indica que haverá não deveria Espero que isso tenha sido resolvido

Bem, vamos encerrar devagar... Darei dois exemplos com explicações, durante os quais aprenderemos como salvar o resultado da pesquisa em uma variável e aprenderemos como verificar a correção do endereço postal

Eu vi e salvei!

Meu blog

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

Em nossa expressão regular descrevemos todos os caracteres possíveis que podem ser incluídos em um link. Também quero prestar atenção aos caracteres de aspas e “/” em nossa expressão. Eles são precedidos por uma barra invertida, para que serve? O fato é que "/" e as aspas são caracteres especiais. E para que o modelo os perceba como símbolos comuns, precisamos protegê-los. O escape é feito adicionando uma barra invertida antes dos caracteres especiais. Espero que esteja claro

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

Pois bem, nesse sentido, é necessário adicionar um parâmetro adicional na forma da variável $b, na qual será armazenado o link encontrado. Você também precisa saber que o resultado da pesquisa é colocado em uma matriz. Portanto, a variável $b é um array. A informação que procuramos está no índice 1. Isso significa que o resultado da pesquisa está na variável $b. Vamos exibir o resultado na tela:

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

O endereço certo é a chave para o sucesso!

E por fim, a resposta à pergunta, o e-mail está correto? Primeiro você precisa descobrir quais caracteres são permitidos nos endereços. Pelo que eu sei, os caracteres permitidos incluem:

  • Letras inglesas, números, “_”, “-” ummmm tudo parece ser... Prosseguiremos a partir disso.
  • Em seguida temos "@"
  • Depois, letras inglesas
  • Próximo período
  • E novamente letras em inglês...

Portanto a expressão regular será a seguinte:

$a = " [e-mail protegido]";
if(preg_match("/^+@+.+$/", $a)) echo "o endereço de e-mail está correto!";
else echo "o endereço de e-mail NÃO está escrito corretamente!";

Bem... espero que esses registros não o assustem agora e que você possa entendê-los perfeitamente.

Por último, quero dizer uma coisa. O artigo revelou-se complicado e, ao mesmo tempo, cobriu apenas parte das possibilidades. Se você está lendo esta frase, provavelmente a leu até o fim, pelo que muito obrigado

Em relação à série de artigos sobre o desenvolvimento de um blog cms, a primeira parte da série Declaro fechado! Num futuro próximo começaremos a implementar o painel de administração, por isso não “troque”. Se tiver alguma dúvida, terei prazer em responder. Tudo de bom para você, é tudo que tenho!

Ao trabalhar com textos em qualquer linguagem de programação moderna, os desenvolvedores enfrentam constantemente as tarefas de verificar a conformidade dos dados inseridos com o padrão desejado, pesquisar e substituir fragmentos de teste e outras operações típicas de processamento de informações simbólicas. Desenvolver seus próprios algoritmos de verificação leva à perda de tempo, incompatibilidade de código do programa e complexidade no seu desenvolvimento e modernização.

O rápido desenvolvimento da Internet e das linguagens de desenvolvimento WEB exigiu a criação de ferramentas de processamento universais e compactas informações de texto com a quantidade mínima de código necessária para isso. A linguagem PHP, popular entre iniciantes e desenvolvedores profissionais, não é exceção. A expressão regular como linguagem de modelo de texto permite simplificar as tarefas de processamento de texto e reduzir o código do programa em dezenas e centenas de linhas. Muitos problemas não podem ser resolvidos sem ele.

Expressões regulares em PHP

A linguagem PHP contém três mecanismos para trabalhar com expressões regulares - “ereg”, “mb_ereg” e “preg”. A mais comum é a interface "preg", cujas funções fornecem acesso à biblioteca de expressões regulares PCRE, originalmente desenvolvida para a linguagem Perl, que acompanha o PHP. As funções Preg pesquisam uma determinada sequência de texto em busca de correspondências de acordo com um padrão específico na linguagem de expressão regular.

Noções básicas de sintaxe

Em um pequeno artigo é impossível descrever em detalhes toda a sintaxe das expressões regulares; existe literatura especial para isso; Apresentamos apenas os elementos principais para mostrar as amplas possibilidades para o desenvolvedor e entender os exemplos de código.

B é formalmente definido de uma maneira muito complexa, então vamos simplificar a descrição. Uma expressão regular é uma string de texto. Consiste em um padrão destacado por um delimitador e um modificador que indica como processá-lo. É possível incluir diversas alternativas e repetições nos templates.

Por exemplo, na expressão /\d(3)-\d(2)-\d(2)/m o separador será «/» , então vem o padrão e o símbolo "eu" será um modificador.

Todo o poder das expressões regulares é codificado usando metacaracteres. O principal metacaractere da linguagem é a barra invertida - “\”. Ele inverte o tipo do caractere que o segue (ou seja, um caractere regular torna-se um metacaractere e vice-versa). Outro metacaractere importante é a barra "|", que especifica variações alternativas do padrão. Mais exemplos de metacaracteres:

PHP, ao processar expressões regulares, trata os espaços como separados símbolo significativo, então as expressões ABCWHERE e ABCWHERE são diferentes.

Subpadrões

No PHP, os subpadrões regulares são separados por parênteses e às vezes são chamados de "subexpressões". Execute as seguintes funções:

    Destacando alternativas. Por exemplo, modelo calor(algo|pássaro|) combina com as palavras "calor", "pássaro de fogo" E "assar". E sem os parênteses seria apenas uma string vazia, “bird” e “roast”.

    Subpadrão "emocionante". Isso significa que se uma substring corresponder ao padrão, todas as correspondências serão retornadas como resultado. Para maior clareza, vamos dar um exemplo. Dada a seguinte expressão regular: o vencedor recebe((dourado|dourado)(medalha|copa)) - e uma linha para encontrar correspondências: "o vencedor recebe uma medalha de ouro". Além da frase original, o resultado da pesquisa retornará: "medalha de ouro", "medalha", "ouro".

Operadores de repetição (quadriificadores)

Ao escrever expressões regulares, muitas vezes é necessário analisar repetições de números e símbolos. Isto não é um problema se não houver muitas repetições. Mas o que fazer quando não sabemos o seu número exato? Neste caso, você deve usar metacaracteres especiais.

Para descrever as repetições, são usados ​​​​quadrificadores - metassímbolos para especificar a quantidade. Quadrificadores são de dois tipos:

  • geral, entre colchetes;
  • abreviado.

O quantificador geral é afetado pelo mínimo e Quantia máxima permitiu repetições do elemento como dois números entre chaves, por exemplo: x(2,5). Se o número máximo de repetições for desconhecido, o segundo argumento é omitido: x(2,).

Quantificadores abreviados representam símbolos para as repetições mais comuns para evitar confusão de sintaxe desnecessária. Três abreviaturas são comumente usadas:

1. * - zero ou mais repetições, o que equivale a (0,).

2. + - uma ou mais repetições, ou seja,).

3. ? - zero ou apenas uma repetição - (0,1).

Exemplos de expressões regulares

Para quem está aprendendo expressões regulares, os exemplos são o melhor tutorial. Apresentaremos alguns que mostram suas amplas capacidades com um mínimo de esforço. Todos códigos de programa totalmente compatível com PHP versões 4.xe superiores. Para entender completamente a sintaxe e usar todos os recursos da linguagem, recomendamos o livro “Regular Expressions” de J. Friedl, que discute completamente a sintaxe e contém exemplos de expressões regulares não apenas em PHP, mas também para Python, Perl, MySQL, Java, Ruby e C#.

Verificando a exatidão do endereço de e-mail

Tarefa. Existe uma página na Internet que solicita um endereço de e-mail ao visitante. A expressão regular deve verificar se o endereço recebido está correto antes de enviar mensagens. A verificação não garante que o especificado Caixa de correio realmente existe e aceita cartas. Mas pode eliminar endereços obviamente incorretos.

Solução. Como em qualquer linguagem de programação, expressões regulares para verificação de endereço de e-mail podem ser implementadas em PHP jeitos diferentes, e os exemplos neste artigo não são a única opção final. Portanto, em cada caso forneceremos uma lista de requisitos que devem ser levados em consideração na programação, e a implementação específica depende inteiramente do desenvolvedor.

Assim, uma expressão que verifica se um email é válido deve verificar as seguintes condições:

  1. A presença do símbolo @ na string de origem e a ausência de espaços.
  2. A parte do domínio do endereço, seguida pelo símbolo @, contém apenas caracteres válidos para nomes de domínio. O mesmo se aplica ao nome de usuário.
  3. Ao verificar um nome de usuário, você precisa procurar caracteres especiais, como apóstrofo ou Esses caracteres são potencialmente perigosos e podem ser usados ​​em ataques como injeção de SQL. Evite esses endereços.
  4. Os nomes de usuário permitem apenas um ponto, que não pode ser o primeiro ou último personagem em linha.
  5. O nome de domínio deve conter no mínimo dois e no máximo seis caracteres.

Um exemplo que leva em consideração todas essas condições pode ser visto na figura abaixo.

Verificando a validade dos URLs

Tarefa. Verifique se uma determinada sequência de texto é válida Mais uma vez, as expressões regulares de verificação de URL podem ser implementadas de várias maneiras.

Solução. Nossa versão final fica assim:

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

Agora vamos examinar seus componentes com mais detalhes usando a figura.

Verificando números de cartão de crédito

Tarefa.É necessário verificar a exatidão do número do cartão plástico inserido para os sistemas de pagamento mais comuns. Opção considerada apenas para cartões

Solução. Ao criar uma expressão, deve-se levar em consideração a possível presença de espaços no número inserido. Os números do cartão são divididos em grupos para facilitar a leitura e o ditado. Portanto, é bastante natural que uma pessoa tente inserir o número desta forma (ou seja, usando espaços).

Escrever uma expressão universal que leve em conta possíveis espaços e hifens é mais difícil do que simplesmente descartar todos os caracteres, exceto os números. Portanto, é recomendado usar o metacaractere /D na expressão, que remove todos os caracteres, exceto números.

Agora você pode prosseguir diretamente para a verificação do número. Todas as empresas produtoras cartões de crédito, use um formato numérico exclusivo. O exemplo utiliza isso, e o cliente não precisa inserir o nome da empresa - ele é determinado pelo número. Cartões Visa sempre comece com 4 e tenha um número de 13 ou 16 dígitos. MasterCard começa no intervalo 51-55 com um comprimento numérico de 16. Como resultado, obtemos a seguinte expressão:

Antes de processar um pedido, você pode realizar uma verificação adicional do último dígito do número, que é calculado usando o algoritmo Luhn.

Verificando números de telefone

Tarefa. Verificando a exatidão do número de telefone inserido.

Solução. Número de dígitos em telefones fixos e celulares números de telefone varia significativamente de país para país, por isso não é possível verificar universalmente se um número de telefone está correto usando expressões regulares. Mas números internacionais têm um formato estrito e são ótimos para verificar em um modelo. Além disso, cada vez mais países operadoras de telefonia tentando atender ao mesmo padrão. A estrutura do número é a seguinte:

+CCC.NNNNNNNNNNxEEEE, Onde:

C é o código do país, composto por 1-3 dígitos.

N - número com até 14 dígitos.

E - extensão opcional.

O sinal de mais é um elemento obrigatório e o sinal x está presente apenas quando a expansão é necessária.

Como resultado, temos a seguinte expressão:

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

Números no intervalo

Tarefa. Você deve corresponder a um número inteiro dentro de um intervalo específico. Além disso, é necessário que as expressões regulares correspondam apenas a números de um intervalo de valores.

Solução. Aqui estão algumas expressões para alguns dos casos mais comuns:

Encontrando um endereço IP

Tarefa. Você deve determinar se a sequência fornecida é um endereço IP válido no formato IPv4 no intervalo 000.000.000.000-255.255.255.255.

Solução. Como acontece com qualquer tarefa em PHP, as expressões regulares têm muitas variações. Por exemplo, isto:

Verificação de expressão online

Testar a correção de expressões regulares pode ser difícil para novos programadores devido à complexidade da sintaxe, que difere das linguagens de programação “regulares”. Para resolver este problema, existem muitos testadores de expressões online que facilitam a verificação da exatidão do modelo criado em texto real. O programador insere a expressão e os dados a serem testados e vê instantaneamente o resultado do processamento. Normalmente há também uma seção de referência onde são descritas em detalhes expressões regulares, exemplos e diferenças de implementação para as linguagens de programação mais comuns.

Mas confiar totalmente nos resultados dos serviços online não é recomendado para todos os desenvolvedores que usam PHP. Uma expressão regular, escrita e testada pessoalmente, melhora suas habilidades e garante a ausência de erros.

Expressões regulares são padrões especiais para pesquisar substrings no texto. Com a ajuda deles, você pode resolver os seguintes problemas em uma linha: “verificar se uma string contém números”, “encontrar todos endereço de e-mail", "substitua vários pontos de interrogação consecutivos por um."

Vamos começar com uma sabedoria popular de programação:

Algumas pessoas, quando se deparam com um problema, pensam: “Sim, sou inteligente, vou resolver usando expressões regulares”. Agora eles tem dois problemas.

Exemplos de modelos

Vamos começar com alguns exemplos simples. A primeira expressão da figura abaixo procura uma sequência de 3 letras, onde a primeira letra é “k”, a segunda é qualquer Carta russa e o terceiro é um "t" que não diferencia maiúsculas de minúsculas (por exemplo, "cat" ou "CAT" se ajusta a esse padrão). A segunda expressão pesquisa a hora no texto no formato 12:34.

Qualquer expressão começa com um caractere delimitador. O símbolo / geralmente é usado como tal, mas você também pode usar outros símbolos que não tenham uma finalidade especial em expressões regulares, por exemplo, ~, # ou @. Delimitadores alternativos serão usados ​​se o caractere / puder aparecer na expressão. Depois vem o padrão da string que procuramos, seguido de um segundo delimitador, e no final pode haver uma ou mais letras de bandeira. Eles perguntaram opções adicionais ao pesquisar por texto. Aqui estão alguns exemplos de sinalizadores:

  • i - diz que a pesquisa não deve diferenciar maiúsculas de minúsculas (diferencia maiúsculas de minúsculas por padrão)
  • u - diz que a expressão e o texto pesquisado usam a codificação utf-8, e não apenas letras latinas. Sem ele, a busca por caracteres russos (e quaisquer outros caracteres não latinos) pode não funcionar corretamente, portanto você deve sempre configurá-lo.

O modelo em si consiste em caracteres comuns e construções especiais. Bem, por exemplo, a letra “k” em expressões regulares significa ela mesma, mas os símbolos significam “qualquer número de 0 a 5 pode estar neste lugar”. Aqui lista completa caracteres especiais (no manual do PHP eles são chamados de metacaracteres), e todos os outros caracteres na sequência regular são comuns:

A seguir analisaremos o significado de cada um desses caracteres (e também explicaremos porque a letra “е” é colocada separadamente na primeira expressão), mas por enquanto vamos tentar aplicar nossas expressões regulares ao texto e ver o que acontece. PHP tem uma função especial preg_match($regexp, $text, $match) que recebe expressão regular, texto e um array vazio como entrada. Ele verifica se o texto contém uma substring que corresponde ao padrão fornecido e retorna 0 se não, ou 1 se houver. E no array passado, a primeira correspondência encontrada com a sequência regular é colocada no elemento com índice 0. Vamos escrever um programa simples que aplique expressões regulares a diferentes strings:

Depois de ver o exemplo, vamos estudar as expressões regulares com mais detalhes.

Parênteses em expressões regulares

Vamos repetir o que eles significam tipos diferentes colchetes:

  • Aparelho ortodôntico a(1,5) especifica o número de repetições do caracter anterior - neste exemplo, a expressão procura de 1 a 5 letras “a” consecutivas
  • Colchetes significam “qualquer um desses caracteres”, neste caso as letras a, b, c, x, y, z ou um número de 0 a 5. Outros caracteres especiais como | ou * - eles denotam um caractere regular. Se houver um símbolo ^ no início dos colchetes, o significado muda para o oposto: “qualquer caractere exceto os indicados” - por exemplo [^a-c] significa “qualquer caractere exceto a, b ou c”.
  • Os parênteses agrupam caracteres e expressões. Por exemplo, na expressão abc+, o sinal de mais refere-se apenas à letra c e esta expressão procura palavras como abc, abcc, abccc. E se você colocar parênteses a(bc)+, então o quantificador plus se refere à sequência bc e a expressão procura as palavras abc, abcbc, abcbcbc

Observação: você pode especificar intervalos de caracteres entre colchetes, mas lembre-se de que a letra russa е é separada do alfabeto e para escrever “qualquer letra russa” você precisa escrever [a-яе].

Barras Bex

Se você leu outros tutoriais sobre expressões regulares, provavelmente notou que a barra invertida é escrita de forma diferente em todos os lugares. Em algum lugar eles escrevem uma barra invertida: \d , mas aqui nos exemplos ela é repetida 2 vezes: \\d . Por que?

A linguagem de expressão regular exige que você escreva a barra invertida uma vez. Porém, em linhas simples e aspas duplas em PHP a barra invertida também tem um significado especial: um manual sobre strings. Bem, por exemplo, se você escrever $x = "\$"; então o PHP tratará isso como uma combinação especial e inserirá apenas o caractere $ na string (e o mecanismo de expressão regular não saberá sobre a barra invertida antes dela). Para inserir a sequência \$ em uma string, devemos dobrar a barra invertida e escrever o código como $x = "\\$"; .

Por esse motivo, em alguns casos (onde a sequência de caracteres tem um significado especial no PHP) somos obrigados a dobrar a barra invertida:

  • Para escrever \$ em expressão regular, escrevemos "\\$" no código
  • Para escrever \\ em expressão regular, dobramos cada barra invertida e escrevemos "\\\\"
  • Para escrever uma barra invertida e um número (\1) no formato normal, você precisa dobrar a barra invertida: "\\1"

Em outros casos, uma ou duas barras invertidas darão o mesmo resultado: "\\d" e "\d" inserirão um par de caracteres \d na linha - no primeiro caso, 2 barras invertidas são a sequência para inserir uma barra invertida , no segundo caso não há sequência especial e os caracteres serão inseridos como estão. Você pode verificar quais caracteres serão inseridos em uma string e o que o mecanismo de expressões regulares verá usando echo: echo "\$"; . Sim, é difícil, mas o que você pode fazer?

Projetos especiais na temporada regular

  • \d procura por qualquer dígito, \D - qualquer caractere, exceto um dígito
  • \w corresponde a qualquer letra (de qualquer alfabeto), número ou sublinhado _ . \W corresponde a qualquer caractere, exceto letra, número ou sublinhado.

Além disso, existe uma condição conveniente para indicar o limite de uma palavra: \b . Esta construção significa que de um lado deve haver um caractere que seja uma letra/número/sublinhado (\w), e do outro lado deve haver um caractere que não seja. Bem, por exemplo, queremos encontrar a palavra “gato” no texto. Se escrevermos a expressão regular /cat/ui, então ele encontrará a sequência dessas letras em qualquer lugar - por exemplo, dentro da palavra “gado”. Claramente não era isso que queríamos. Se adicionarmos uma condição de limite de palavra à expressão regular: /\bcat\b/ui , agora apenas a palavra independente “cat” será pesquisada.

Manual

  • Sintaxe de expressão regular em PHP, descrição detalhada


gastroguru 2017