Jaime Neto | desenvolvimento para web

jun/11

20

Filtro de transliteração para o ZF


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); ?>

· · ·

No comments yet.

Leave a Reply

<<

>>

Theme Design by devolux.nh2.me