Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KabuqueJoe

[Resolvido] Filtro para SEO URLs

Recommended Posts

Depois de quebrar a cabeça um pouco e passar várias horas de pesquisa finalizei a seguinte função:

 

<?php
function seoUrl($str){
	$str = strtolower($str);  // tudo 'lowercase'
	$a = array('à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ý','ý','þ','ÿ','/','\\','.','_',' ',"\n","'","=",'+');
	$b = array('a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','d','n','o','o','o','o','o','o','u','u','u','u','y','b','s','a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','d','n','o','o','o','o','o','o','u','u','u','y','y','b','y','-','-','-','-','-','-','-','-','-',);
	$str2 = str_ireplace($a, $b, $str); // substitue $a por $b
	$str3 = preg_replace('/[^a-zA-Z0-9_ -]/s', '', $str2); // remove tudo que não é de a-z ou 0-9 exceto '_' e '-'
	$str4 = preg_replace('/-{2,}/s', '-', $str3); // so permite um '-' por vez
	$str5 = trim(trim(trim($str4),'_'),'-'); // corta das pontas sobras de '-','_' e ' '
	return $str5; // retorna a string
}
?>

 

Nessa função é possivel filtrar strings para apartir delas criar "SEO URLs".

 

Ex: de "Grêmio x Cruzeiro: duas lideranças em jogo neste domingo no Olímpico! g&*H¨ %$%C ¨%V *(&B(" a função retorna "gremio-x-cruzeiro-duas-liderancas-em-jogo-neste-domingo-no-olimpico-gh-c-v-b"

 

A função tem suporte para filtrar caractéries de várias linguas mas quero ver se consigo aprimorar ela ainda mais.

 

Alguma observação?

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae galera, consegui aprimorar ainda mais a função.

Agora todos os "replaces" são baseadas em "regular expression".

 

	function seoUrl($str){
       $aaa = array('/(à|á|â|ã|ä|å|æ)/','/(è|é|ê|ë)/','/(ì|í|î|ï)/','/(ð|ò|ó|ô|õ|ö|ø)/','/(ù|ú|û|ü)/','/ç/','/þ/','/ñ/','/ß/','/(ý|ÿ)/','/(=|\+|\/|\\\|\.|\'|\_|\\n| |\(|\))/','/[^a-z0-9_ -]/s');
       $bbb = array('a','e','i','o','u','c','d','n','s','y','-','');
       return trim(trim(trim(preg_replace('/-{2,}/s', '-', preg_replace($aaa, $bbb, strtolower($str)))),'_'),'-');
   }

 

Alguma dica para melhorar ainda mais?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, com certeza.

 

Usando strtr(), a parte do preg_replace(), que é ligeiramente mais lento, você faz com uma linha.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Letras maiúsculas acentuadas ou com cedilha nem sempre são transformadas em minúculas com a função strtolower. Portanto é bom você incluir essas letras acentuadas também em maiúculas nas suas ERs para serem transformadas em minúculas.

 

Exemplo com a letra A:

 

array('/(à|á|â|ã|ä|å|æ|À|Á|Â|Ã|Ä)/', ...

Se o ambiente estiver definido como pt_BR a função strtolower funciona normalmente com acentuação, mas para manter a compatibilidade eu acho melhor colocar as letras maiúsculas acentuadas na ER.

 

Para definir a linguagem como pt_BR basta usar:

 

setlocale(LC_ALL, 'pt_BR', 'ptb');

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou isso, ou àquilo que for passado para strtr() já sofrer os efeitos de strtolower().

 

Já que as URL's, focadas em SEO, devem ser (sempre) minúsculas...

 

Ou, se não, basta incluir nas traduções as versões capitalizadas das letras que possuem acento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.