Já por várias vezes trabalhando em sites, tive a necessidade de converter strings para um formato sem acentos, cedilha, espaços, caracteres especiais, ou letras maiúsculas. Seja pra renomear um arquivo, renomear o título de uma notícia para a url ou criar um alias para um nome de usuário, a idéia é sempre a mesma, ou no mínimo muito semelhante. Isso é chamado transliteração, ou mais comumente, em inglês transliteration.
Procurando na internet achei várias expressões regulares que fazem o trabalho, mas nenhuma dela tinha tudo que eu queria, então resolvi fazer uma classe seguindo o modelo de classes do Zend Framework, e acabei fazendo duas: uma de filtro, e um view helper, que usa o filtro.
class My_Filter_Transliterate implements Zend_Filter_Interface { public function filter($string) { // Lista de caracteres que devem ser substituídos $a = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ$ßàáâãäåæ@çèéêë&' . 'ìíîïðñòóôõöøùúûüýýþÿŔŕ°ºª,.;:\|/"^~*%# ()[]{}=!?`‘’' . "'"; // Lista que irá substituir os caracteres acima $b = 'aaaaaaaceeeeiiiidnoooooouuuuybssaaaaaaaaceeeee' . 'iiiidnoooooouuuuyybyRrooa--------------------------' . '-'; // Efetua a substituição $string = strtr($string, $a, $b); // Deixa tudo minúsculo $string = strtolower($string); // Evita hífens repetidos $string = preg_replace('/--+/', '-', $string); return $string; } } |
Pronto, tá feito o filtro. Agora pra usar em qualquer lugar, é só instanciar o filtro e chamar o método filter()
. Como no exemplo:
$filterTransliterate = new My_Filter_Transliterate(); $string = 'Já não era sem tempo de Jaime lançar um post novo ' . 'nesse blog!!!'; echo $filterTransliterate->filter($string); // ja-nao-era-sem-tempo-de-jaime-lancar-um-post-novo-nesse-blog- |
Agora, só pra facilitar ainda mais, vamos criar um view helper pra usarmos nos nossos scripts.
class My_View_Helper_Transliterate extends Zend_View_Helper_Abstract { public function transliterate($value) { $filterTransliterate = new My_Filter_Transliterate(); return = $filterAlias->filter($value); } } |
Simples assim… Agora, dentro dos arquivos de layout ou view, é só chamar como no exemplo abaixo:
<?php echo $this->transliterate($this->post->title); ?> |