leitura de
Encontrou um problema no conteúdo? Por favor, deixe seu comentário!

Como prometido, hoje vou continuar o tutorial sobre URLs amigáveis… Ontem fizemos uma introdução e explicação básica sobre as regras simples e hoje vamos falar sobre regras mais complexas que usam expressões regulares.

Atualização 30/04/10: Adicionei algumas informações extras e fiz algumas correções nas RewriteRules. ### Reescrevendo URLs que possuem parâmetros Continuando o nosso exemplo, faremos agora a reescrita de URL do seguinte caso: http://meusite.com/produtos.php?id=2 (A URL atual) http://meusite.com/produtos/camiseta-rosa/2/ (A nova URL) Nesse caso temos dois termos importantes na URL: O termo marcado em amarelo identifica de qual URL estamos tratando, no nosso caso será a URL de exibição de um produto (um possível caso pra uma loja-virtual) o que poderia ser o mesmo caso da exibição de uma notícia ou artigo em um site com esse tipo de conteúdo. O termo marcado em verde é o ID do produto... Esse é o valor que será usado internamente pelo seu produtos.php para exibir o produto correto. Perceba que esse mesmo termo precisa estar presente na nova URL pois é exatamente ele que será usado pelo seu arquivo "antigo" quando a URL for redirecionada. Perceba também que adicionamos um novo "termo" (valor) que é o nome do produto... Isso ajuda a melhorar a URL trazendo mais informações relevantes, aumentando a pontuação da página nos sistemas de busca e dizendo para o visitante o que ele verá ao clicar naquela URL. Você precisa entender que essa informação adicional, a princípio, não faz diferença alguma pro funcionamento do seu site, é apenas um bônus já que o seu sistema continuará identificando o produto pelo seu ID que está na última parte da URL. ### Reescrevendo a URL O nosso .htaccess para reescrever a URL anterior (da página de contato) e essa nova URL mais complexa, ficará assim:

Agora vamos separar a regra de reescrita em três partes e explicar uma por uma: RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC] Vai ser preciso começar a entender um pouco sobre expressões regulares agora... Vamos lá! ### Expressões Regulares As expressões regulares ou RegExp ou ER são formas de você validar uma string (texto). Suponhamos que você precise verificar se uma string é composta apenas por letras minúculas. Você pode fazer isso com a expressão regular ^[a-z]+$, vamos tender o que isso significa: O circunflexo ^ significa "o começo da string" e o cifrão $ significa "o fim da string"... Então, toda a ER que estiver entre o ^ e o $ precisa "validar" pra toda a string, e não apenas uma parte dela. Entre eles temos [a-z]+, isso significa: um grupo de caracteres (delimitado pelos colchetes [ ]) composto por "qualquer letra minúscula" (a-z) que tenha no mínimo 1 caractere +. A expressão regular a cima iria validar strings como planeta e casa mas iria invalidar strings como casal feliz, planeta1, CaSa ou pôr-do-sol pois essas strings não possuem apenas letras de a-z minúsculas. Outro exemplo que podemos usar é a expressão ^[0-9]{3,9}-(.*)$ que vamos "destripar" agora: Começamos com [0-9]{3,9} que significa um grupo de números (de 0 a 9) que tenha entre 3 e 9 dígitos, ou seja: qualquer número de 3 até 9 digitos. Depois temos um hífen - normal. E no final da ER temos (.*) que significa, acreditem se quiser, qualquer caractere! Qualquer coisa! Calma... calma! Eu explico: o ponto . é o caractere coringa das expressões regulares, e o asterisco * signficia "nenhuma, uma ou mais de uma 'unidade' do caractere anterior". Sabendo disso, podemos entender que a expressão regular ^[0-9]{3,9}-(.*)$ valida strings como 014-a8!@cas, 11111-eahuaa e 123456789-, mas não valida strings como 0-a8!@cas, -eahuaa, 8928745614-abc e 89-abc pois as mesmas não começam com "números entre 3 e 9 digitos" [0-9]{3,9}. Poderiamos modificar a expressão regular para: ^[0-9]{3,9}- e ela teria o mesmo comportamento pois só precisamos verificar o começo da string... :) Recomendo que você pare um pouquinho para ler o [Guia de Expressões Regulares](http://guia-er.sourceforge.net/), é muito bom e vai te ajudar a entender melhor uma das sete maravilhas da Informática que é uma Expressão Regular. Agora vamos voltar a nossa URL Amigável: RewriteRule ^produtos/([a-z0-9-]+)/([0-9]+)/?$ /produtos.php?id=$2&nome=$1 [NC] #### Primeira parte Na primeira parte, em amarelo, temos ^produtos/([a-z0-9-]+)/([0-9]+)/?$, o que isso significa? Vamos dividir essa parte em pequenos blocos e explicar cada um: ^produtos/ - A URL precisa começar com produtos/ /([a-z0-9-]+)/ - A expressão regular ([a-z0-9-]+) significa "no mínimo um(a) + letra minúscula a-z OU letra maiúscula A-Z OU número 0-9 OU um hífen -" /([0-9]+)/?$ - E por fim temos ([0-9]+) que signfica "no minimo + um número 0-9" seguido de uma barra opcional /? e o fim da url. Isso tudo significa que, com a primeira parte, validamos strings como /produtos/camiseta-azul/2/, /produtos/bola/89/ e /produtos/cachecol-rosa-da-2a-africa-do-sul/666/ e invalidamos strings como /produtos/palhaço/a/, /produtos/camisa/ ou /produtos/camiseta legal/187a/. #### Segunda parte Na segunda parte, em amarelo, temos /produtos.php?id=$2&nome=$1, o que isso significa? Significa que iremos passar os valores encontrados na primeira parte para uma nova URL interna, ou seja, chamaremos o arquivo /produtos.php e passaremos dois parâmetros via GET para ele: Temos $2 no parâmetro id, esse "sifrao dois" significa a segunda "variável" encontrada na URL, que nesse caso é a parte ([0-9]+) da expressão regular, que conterá o ID do produto. E temos $1 no parâmetro nome, esse "sifrao um" significa a primeira "variável" encontrada na URL, que nesse caso é a parte ([a-z0-9-]+) da expressão regular, que conterá o nome do produto! :) Com isso tudo, ao chamar a URL /produtos/camiseta-azul/2/ o Apache irá, malandramente e internamente, direcionar a requisição para o caminho /produtos.php?id=2&nome=camiseta-azul. Perceba que os valores (2 e camiseta-azul) foram passados para o "antigo" arquivo, cada um em seu devido lugar... Com isso, ao executar o arquivo /produtos.php você terá acesso aos dois valores que foram passados na URL Amigável utilizando a super-global $_GET:
Quer coisa melhor que isso minha gente?! #### Terceira parte Na terceira parte, em azul claro, temos [NC], que ja foi explicado antes e significa "No Case" ou "Sem distinção de minúsculas ou maiúsculas". :) -- Só para reforçar para quem ainda não pegou a essência da coisa: Na primeira parte temos uma expressão regular que, se ela validar a URL que o visitante está acessando, a requisição vai ser redirecionada para o caminho especificado na segunda parte. ### Mais exemplos de URLs Amigáveis Vamos ver mais alguns exemplos que podemos colocar no nosso .htaccess e o entendimento de cada uma das regras, fica por sua conta:
Uma ferramenta que pode ajudá-los a testar expressões regulares é a [RegExr: Online Regular Expression Testing Tool](http://gskinner.com/RegExr/). Espero realmente que vocês tenham gostado... Amanhã vou tentar abordar outros assuntos e, dependendo do retorno e das dúvidas que vocês deixarem nos comentários, faço outro artigo sobre URLs Amigáveis. Um grande abraço, uma boa noite, e deixem mais comentários! :)

Thiago Belem / Blog

Thiago Belem


Publicado

Thiago Belem / Blog

Thiago Belem / Blog

Artigos e tutoriais sobre desenvolvimento WEB

Continue lendo