Já devem ter reparado, em centenas de sites por essa ‘Net fora – aqui no DreamsInCode, por exemplo – em endereços cujo caminho é semelhante ao título da página; nalguns casos, inclui mesmo categorias. O caso em que me baseei foi o do site do jornal Público, por ter exactamente a característica que eu queria, e que o WordPress não tem. Se repararem neste URL, por exemplo, http://www.publico.clix.pt/Sociedade/divulgacao-de-escutas-na-internet-punivel-pela-lei-do-cibercrime_1419063, verificam que os caracteres acentuados constam do mesmo, o que não acontece com o WordPress, por exemplo.

Posto isto, o problema tem duas fases: converter os títulos ou os nomes dos registos para uma versão compatível com URL’s e depois redireccionar os novos URL’s para os scripts correspondentes ao tratamento do pedido. No entanto, converter os títulos, que parecia tarefa simples, foi, na verdade, bastante complicado; para isso contribuiu a codificação dos registos na base de dados, que está em UTF-8 (e se não tiverem em UTF-8, deviam ter).

A primeira coisa que nos vem à cabeça perante um problema destes é usar a função de tradução do PHP, strtr, na sua versão directa, isto é, com duas strings, contendo a primeira os caracteres com diacríticos e a segunda as suas versões normais (por exemplo, strtr($titulo, 'áàâã', 'aaaa');). Se tentarem fazer isto, contendo a variável $titulo uma string em UTF-8, os resultados serão imprevisíveis. Acontece que o PHP, apesar de excelentes esforços nos últimos anos, ainda não é compatível com UTF-8, tendo uma libraria à parte para lidar com strings nessa codificação.

Olhando precisamente para essa libraria, encontramos uma função que nos poderia dar alguma esperança – mb_ereg_replace. Ao pensar na enormidade da tarefa, logo nos arrefece a esperança: teríamos que ter uma imensidão de substituições, uma diferente para cada caracter com diacrítico a traduzir (são cerca de 200, para jogarmos pelo seguro). Além disso, as manobras de expressões regulares com ereg são bastante lentas, quando comparadas com uma substituição directa ou até mesmo com preg.

Como a string que nós queremos não necessita da codificação UTF-8 – afinal, são apenas caracteres pertencentes à parte normal da norma ASCII, a função que precisamos acaba por ser um híbrido: tem partes que tratam da codificação, e tem partes que tratam da substituição. Na realidade, a função que apresento abaixo tem ainda mais fases: traduz os caracteres com diacríticos para a sua versão normal; substitui todos os caracteres que não sejam letras e números por um espaço (incluíndo os próprios espaços – é necessário, porque o próprio espaço é o caracter para substituição); substitui todos os espaços por hífens; e, finalmente, recodifica a string resultante para UTF-8. Este último passo é opcional, só o faço para evitar ao máximo problemas ao inserir na BD. De notar o tratamento da codificação dado nas primeiras linhas.

$titulo = strtolower(utf8_decode($titulo));

$caracDiacrit = utf8_decode("áăǎâäǟȧǡȁàȃāąåǻãæǽǣɑɓƀƃɵćčçĉɕċ" .
                            "ƈȼɷʚďȡɗđɖƌdzdžéĕěȩêëėȅèȇēęɇƒǵğǧģ" .
                            "ĝġɠǥɣȟĥɦħɧíĭǐîïȉìȋīįɨĩɩǰĵʝɉǩķƙ" .
                            "ĸĺƚɬľļȴŀɫɭłƛſɱńňņȵǹɲƞɳñóŏǒôöȫȯ" .
                            "ȱőȍòơȏōǫǭøǿõȭƣɛɔȣƥɸʠɋŕřŗȑɾȓɼɍɽ" .
                            "ɤśšşŝșʂȿəɚɡßťţțȶƭƫʈŧþʉúŭǔûüǘǚǜ" .
                            "ǖűȕùưȗūųůũʊʋŵýŷÿƴȳɏȝźžʑżȥʐƶɀ");

$caracNormal =              "aaaaaaaaaaaaaaaaeeeabbbocccccc" .
                            "ccoeddddddzzeeeeeeeeeeeeefgggg" .
                            "ggggghhhhhiiiiiiiiiiiijjjjjkkk" .
                            "klllllllllllsmnnnnnnnnnooooooo" .
                            "ooooooooooooooeooppqqrrrrrrrrr" .
                            "rsssssssssgstttttttttuuuuuuuuu" .
                            "uuuuuuuuuuuvwyyyyyyyzzzzzzzz";

$url_string = utf8_encode(str_replace(" ", "-", preg_replace("/(?:( )|(\W))*/", "$1", strtr( $titulo, $caracDiacrit, $caracNormal))));

A segunda parte, a sair amanhã, tratará do mod_rewrite do Apache, que nos permitirá usar estas strings nos nossos URL’s humanos.

Adenda:

Segunda parte aqui.

Partilhar no Sapo Links Partilhar no del.icio.us Partilhar no Digg Partilhar no Twitter Partilhar no StumbleUpon Partilhar no MySpace Partilhar no Facebook

Comentários Deixar um comentário

 Categorias
 Arquivo
 Projectos em Destaque
 Últimas Postas no Blog
 Últimos Comentários do Blog