Você está aqui: Home / programacao / php / expressoes regulares dissecando php 02.html

Expressões Regulares – Dissecando PHP

Expressões Regulares são muito utilizadas no PHP, em alguns casos para validar campos, em outros para procurar sequências específicas. Uma expressão regular poderia ser utilizada para criar uma espécie coletor de emails, poderia ser utilizada para validar campos que um usuário venha a preencher, poderia ser utilizada para verificar se um determinado nome ou sequência de caracteres existe em uma determinada string, etc.

A utilidade de Expressões Regulares é tremenda, mas para utilizar ERs de forma satisfatória você precisa entender bem como é a sintaxe de uma ER. O PHP suporta dois tipos de ER – POSIX-extended e PCRE – a PCRE (Pear Compatible Regular Expression) é a mais rápida e mais “poderosa”, portanto iremos focar nela.

O PHP possui várias funções que suportam Expressões Regulares, podemos citar aqui:
preg_match
preg_quote
preg_replace_callback
preg_replace
preg_match_all
preg_grep
preg_filter
preg_last_error
preg_split

Poderemos estar dissecando cada uma dessas funções nos próximos artigos, mas hoje, nesse post, o foco é que você entenda sobre Expressões Regulares, o suficiente para criar suas próprias ERs sem muita complicação, então lets go there.

Para ilustrar nossos exemplos, iremos utilizar a função preg_match que já foi dissecada aqui no Profissionais Web nesse post Preg_Match PHP

Como montar uma expressão regular?
A estrutura de uma ER pode ser assim:

'/regularexp/'

Note que regularexp é onde você deve inserir a expressão regular em si. Um detalhe importante é que caso você utilize barras dentro da ER você vai precisar colocar uma barra invertida já que trata-se de metacaractere, bom, vamos ver um exemplo pra melhor entendimento.

$pattern = '/http:\/\/profissionais\.ws/';
$result = "";

preg_match($pattern, $subject, $result);

echo "<pre>";
print_r($result);
echo "</pre>";

No exemplo acima eu tenho uma string com o domínio profissionais web, e uma string com a ER, note que utilizei uma barra invertida sempre que uma barra ou ponto apareceu na ER, isso foi feito porque esses são metacaracteres especiais e caso eu não tivesse colocado a barra invertida, eles seriam interpretados por suas funções dentro da ER e não como strings.

Antes de prosseguirmos, é interessante dizer também que você pode utilizar o sinal % invés das barras // para montar a ER, ficaria algo desse tipo:

$pattern = '%http://profissionais\.ws%';

A vantagem nisso é que daí você não vai precisar colocar uma barra invertida em toda barra que apareça na ER, em contrapartida você terá que colocar uma barra invertida antes de cada sinal de percentagem que aparecer na ER. Então é uma questão matemática, caso a barra apareça mais vezes que o sinal de percentagem na ER você poderia utilizar ‘%regexp%’ já que pouparia tempo, caso contrário utilize a outra forma ‘/regexp/’.

Cadeia de Caracteres:

[]

Os sinais [] indicam uma cadeia de caracteres, por exemplo:

'/[1-8]/' - Compreende números de 1 à 8.
'/[a-zA-Z]/' - Compreende letras de a à z, tanto maiúsculas
quanto minúsculas.

Metacaracteres de repetição:
Esses são caracteres que definem a quantia de vezes que um determinado caracter ou cadeia de caracteres devem aparecer, vejamos:

+ - casa no mínimo um caractere ou mais.
? - casa apenas um caractere.
* - casa nenhum ou qualquer número de caracteres.
{2} - limita a quantia exata de caracteres, nesse exemplo 2.
{2,5} - no mínimo dois caracteres e no máximo 5.
{5,} - limita apenas o mínimo em 5 caracteres.
{,200} - limita apenas o máximo em 200 caracteres.

Exemplos:

'/[1-8]+/' -Casa números de 1 à 8, no mínimo um caractere deve
ser encontrado.
'/.*/' - O ponto casa qualquer caractere e o asterisco casa nenhuma
ocorrência ou ilimitadas ocorrências.
'/va[a-z]?/' - Casa exatamente nenhum caractere ou um caractere
que deve estar entra a e z depois de va. ex: vac, val, va
'/ma[a-zA-Z]{3,5}/' - Irá casar macaco, manha, etc, mas não irá
casar  macaquice, macumbeiro, etc. Isso se dá porque os caracteres
subsequentes a ma... devem ser no mínimo 3 e máximo 5.

Outros Metacaracteres:
. – casa qualquer caracteres menos nova linha.
() – indica um grupo de expressões.
^ – casa caracteres no início da linha, já se usado dentro de [] e no
início, nega uma cadeia de caracteres.
$ – casa caracteres no final da string.

Exemplo:

'/.{10}sa/' - casa quaquer cadeia de 10 caracteres seguida por sa.
'/([a-z]{1})([A-Z]{1})/' - casa qualquer dupla de caracteres de a à z
desde que o primeiro seja minúsculo e o segundo maiúsculo.
'/^Contato:.*/' - casará uma linha que inicie com a palavra Contato
seguida de dois pontos, mas se existir algum caractere antes da
palavra contato, incluindo espaços em branco, o ER não irá casar.
'/[^a-z]+/' - Carasá quando no mínimo um ou mais caracteres que
não estejam entre a e z, forem encontrados.
'/[^a-z]+$/' - Mesmo que a ER acima, só que também exige que o
caracter ou caracteres estejam no final da string.

Algumas outras dicas sobre ER:
1- Como casar nova linha (quebra de linha) em expressões regulares?
- Você pode utilizar essas duas idéias:

1) '/\n/' - casa uma quebra de linha
2) '/.*/s' - Colocar o s depois da última barra fará com que
o ponto (.) case qualquer caractere, inclusive new line.

2- Como tornar uma Expressão Regular Case Insensitive (Não diferencia maiúsculas de minúsculas)?
- Veja como:

'/regexp/i' - Colocando o i após a última barra irá tornar
a ER case insensitive.

3- Como casar início e final de linha em uma expressão regular?
- Veja como:

'/^regexp$/m' - Colocar o m após a última barra faz
com que a ER considere as âncoras ^ e $ para inicio
e final de linhas

Além disso, temos também o modificador /x, quando utilizado, os espaços entre os caracteres não especiais não serão considerados. Você também pode unir modificadores para satisfazer seu anseio, dessa forma:

'/regexp/simx'

Essa foi uma introdução às Expressões Regulares com PHP, nos próximos artigos sobre ER irei apresentar algumas aplicações úteis com Expressões Regulares.

Take care!

Gostou? Compartilhe!
        

    2 Responses to Expressões Regulares – Dissecando PHP

    Página 1 de 11
    • Parabéns pelo post!

      Simples, objetivo e muito claro, especialmente em se tratando de um assunto não trivial. Obrigado.

      02/11Responder
      João Paulo Novais
    • Perfeito cara!
      Só devia substitiuir ‘casa’ por caça ou procura, deu-me uma dor de cabeça horrível para entender o que você queria dizer…
      Parabéns!

      28/11Responder
      Rafael
    Página 1 de 11

    Deixe um Comentário

    O seu endereço de email não será publicado Campos obrigatórios são marcados *

    *

    Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    Receba Novidades no Email

    Artigos Populares do Mês