PHP é à quinta-feira – Converter Textos em SEF

12 Comentários

Boas. Ao nível de direitos sobre o código, devo remeter-vos para o meu primeiro artigo desta rubrica.

Para esta semana apresento-vos uma função, ou melhor, um conjunto de funções que são usadas pela principal, cujo objectivo é converter uma string “normal” (normalmente um título de artigo ou semelhante) numa string SEF (Search-Engine Friendly), ou seja, algo que seja facilmente interpretado pelos motores de busca (e pelos browsers) sem problemas, para finalmente poder ser usado na construção de um URL.

 <?php 

function getSEFName($string) {
	$string = trim($string);
	$string = str_replace("_"," ",$string);
	while (strpos($string,"  ")) {
		$string = str_replace("  "," ",$string);
	}
	$string = str_replace(" ","-",$string);
	$string = low($string);
	$string = special_convert($string);
	$string = low($string);
	$string = preg_replace('/[^a-z0-9-]/s','',$string); 

	return $string;
} 

function special_convert($var){
	$chars = array(
		"À" => "A",
		"à" => "a",
		"Â" => "A",
		"â" => "a",
		"Ä" => "A",
		"ä" => "a",
		"Á" => "A",
		"á" => "a",
		"Ã" => "A",
		"ã" => "a",
		"Å" => "A",
		"å" => "a",
		"Æ" => "AE",
		"æ" => "ae",
		"ß" => "B",
		"Ç" => "C",
		"ç" => "c",
		"È" => "E",
		"è" => "e",
		"Ê" => "E",
		"ê" => "e",
		"É" => "E",
		"é" => "e",
		"Ë" => "E",
		"ë" => "e",
		"?" => "E",
		"?" => "e",
		"Ì" => "I",
		"ì" => "i",
		"Î" => "I",
		"î" => "i",
		"Í" => "I",
		"í" => "i",
		"Ï" => "I",
		"ï" => "i",
		"Ð" => "D",
		"ð" => "d",
		"Ñ" => "N",
		"ñ" => "n",
		"Ò" => "O",
		"ò" => "o",
		"Ô" => "O",
		"ô" => "o",
		"Ö" => "O",
		"ö" => "o",
		"Ó" => "O",
		"ó" => "o",
		"Õ" => "O",
		"õ" => "o",
		"Ø" => "O",
		"ø" => "o",
		"Ú" => "U",
		"ú" => "u",
		"Ü" => "U",
		"ü" => "u",
		"Ù" => "U",
		"ù" => "u",
		"Û" => "U",
		"û" => "u",
		"Ý" => "Y",
		"ý" => "y",
		"?" => "Y",
		"ÿ" => "y"
	);
	return str_replace(array_keys($chars),$chars,$var);
} 

function low($str) {
	return mb_strtolower($str,"UTF-8");
}

?>

Modo de utilização:

É bastante simples e intuitivo, segue um exemplo de como transformar o título, por exemplo, “Windows 7 – Instalação Fácil” em “windows-7-instalacao-facil”

<?php 

$titulo = “Windows 7 – Instalação Fácil”;

echo getSEFName($titulo);

?>

Qualquer dúvida ou sugestão, estão completamente à vontade.

Comentários

12

Deixe um comentário

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

  1. Avatar de softclean
    softclean

    Eh eh, ia já refilar que o url gerado podia ter caracteres especiais como o ! e o ?, mas parece que a expressão regular está lá para impedir isso 😉

    Bom trabalho, mais uma dica interessante.

    1. Avatar de Bruno Bernardino

      Obrigado 🙂

      Existe alguma redundância com o low(), etc. mas para garantir que o resultado final é sempre o que se deseja.

      1. Avatar de Tiago Carvalho
        Tiago Carvalho

        Boas. Ia precisamente referir isso. No entanto é uma boa função, dá bastante jeito 🙂

  2. Avatar de Nuno Peralta

    Então… e para textos escritos em grego ou romeno, ou mesmo japonês?

    1. Avatar de Bruno Bernardino

      Terás de alterar a expressão regular dos caracteres permitidos, e/ou adicionar as “conversões” na função special_convert()

      1. Avatar de Nuno Peralta

        Sim, mas isso não será bom para o servidor, pois não? =/
        (Obrigado pela resposta)

        1. Avatar de Bruno Bernardino

          Não vai influenciar… a não ser que eu não tenha percebido a tua pergunta, mas queres saber como “converter”, por exemplo, “メール” em “gmail”, certo?

          1. Avatar de Nuno Peralta

            Pois.. na verdade, a minha pergunta nem foi muito no devido contexto 😛
            Mas sim, o facto de eu criar uma array ENORME, de todos os caracteres usados para alfabeto, será que isso irá meter o script muito lento??

            Mas o meu interesse é mais no facto de eu querer filtrar TODOS os caracteres que não sejam usados para nomes, ou seja, apenas as letras dos alfabetos de todas as línguas.

            E desculpe pela demora 😉

          2. Avatar de Bruno Bernardino

            Peço desculpa Nuno…

            O facto de criar o Array enorme não é preocupante, o que ocupa em memória é muito pouco, não notará quebras de performance.

            Respondi à pergunta?

          3. Avatar de Nuno Peralta

            Respondeu sim, e aliviou-me, porque eu estava a ficar “assustado” da minha array na language-file já estar a ficar bastante grande 😛

            Obrigado! 🙂

  3. Avatar de Guardião
    Guardião

    Gostei, mas podiam aproveitar e explicar como converter os links para SEF usando o htaccess

    1. Avatar de Bruno Bernardino

      Obrigado pela dica, mas já que não seria directamente relacionado com a rubrica (sobre PHP), poderias escrever um artigo sobre isso e enviar para o Pplware, não? 🙂