Removendo acentos e outros caracteres de um String

Em diversos projetos que trabalhei encontrei o mesmo problema. Remover os acentos de uma palavra, frase ou texto.

Montei um algoritmo para resolver meu problema de forma bem simples. Claro que existem diversas outras soluções na internet, algumas bem mais elegantes que esta (usando Regex por exemplo). Acontece que, com as diversas versões do PHP, erros acabem sendo gerados.

Eu montei a função de forma isolada somente para servir de base para seu projeto. A maneira mais simples de utilização em produção, é cria-la dentro de uma classe especifica e realizar a chamada seguindo as regras do Framework que for utilizar.

Explicando o algoritmo!

A função por padão vai remover todos os acentos, mas caso queira remover mais alguma coisa, como opcional coloquei um array de entrada.

O modo de uso é bem simples e direto. Montei um exemplo com as saídas do teste ao fim do código.

Código testado no PHP 5.5.5

<?php
$sampleString = "você acadêmico ácaro prosódia";
 
echo removeAccents($sampleString) . "<br>";

// => sample to remore all letter 'e'
$arrayRemover = array (
        'e'
);

// => sample to remore all letter 'e' and 'aca'
echo removeAccents ($sampleString, $arrayRemover) . "<br>";
$arrayRemover = array (
        'e',
        'aca'
);
echo removeAccents ($sampleString, $arrayRemover) . "<br>";

function removeAccents($string, $array_to_remove = null) {
    $string = preg_replace ( array('/Á/','/À/','/Â/','/Ã/','/Ä/'), 'A', $string );
    $string = preg_replace ( array('/á/','/à/','/â/','/ã/','/ä/','/ª/'), 'a', $string );
    $string = preg_replace ( array('/É/','/È/','/Ê/','/Ë/'), 'E', $string );
    $string = preg_replace ( array('/é/','/è/','/ê/','/ë/'), 'e', $string );
    $string = preg_replace ( array('/Í/','/Ì/','/Î/','/Ï/'), 'I', $string );
    $string = preg_replace ( array('/í/','/ì/','/î/','/ï/'), 'i', $string );
    $string = preg_replace ( array('/Ó/','/Ò/','/Ô/','/Õ/','/Ö/'), 'O', $string );
    $string = preg_replace ( array('/ó/','/ò/','/ô/','/õ/','/ö/','/º/'), 'o', $string );
    $string = preg_replace ( array('/Ú/','/Ù/','/Û/','/Ü/'), 'U', $string );
    $string = preg_replace ( array('/ú/','/ù/','/û/','/ü/'), 'u', $string );
    $string = str_replace ( '/Ç/', 'C', $string );
    $string = str_replace ( '/ç/', 'c', $string );
    if (is_array ( $array_to_remove )) {
        $string = str_replace ( $array_to_remove, '', $string );
    }
    return $string;
}

/**
 * EXIT
 voce academico acaro prosodia
 voc acadmico acaro prosodia
 voc dmico ro prosodia<br>
 */

E agora com o PHP 7?

Com as mudanças do PHP a função acima gera uma serie de avisos, então atualizei com o método abaixo.

Já aproveitei e coloquei a solução para o problema proposto pelo Carlos, nos comentários. Caso seja um array (ou objeto) de strings, como fazer para percorrer todas estas strings e remover todos os acentos.

Código testado no PHP 7.1.0

<?php
// => remove all accents from string
function removeAccents($string){
    $pattern = array("/(á|à|ã|â|ä)/",
          "/(Á|À|Ã|Â|Ä)/",
          "/(é|è|ê|ë)/",
          "/(É|È|Ê|Ë)/",
          "/(í|ì|î|ï)/",
          "/(Í|Ì|Î|Ï)/",
          "/(ó|ò|õ|ô|ö)/",
          "/(Ó|Ò|Õ|Ô|Ö)/",
          "/(ú|ù|û|ü)/",
          "/(Ú|Ù|Û|Ü)/",
          "/(ñ)/",
          "/(Ñ)/");
    $replacement = str_split("aAeEiIoOuUnN");
    return preg_replace($pattern,$replacement,$string);
}

// => walk to an array or object and remove all accents from string
function removeAccentsDeep(&$input) {
    if (is_string($input)) {
        $input = removeAccents($input);
    } else if (is_array($input)) {
        foreach ($input as &$value) {
            removeAccentsDeep($value);
        }
        unset($value);
    } else if (is_object($input)) {
        $vars = array_keys(get_object_vars($input));
        foreach ($vars as $var) {
            removeAccentsDeep($input->$var);
        }
    }
}
echo '<pre>';
$sampleArray = array(array('café','energético',array('não','alcoólica')),array('sofá'));
removeAccentsDeep($sampleArray);
print_r($sampleArray);

/** EXIT
Array
(
    [0] => Array
        (
            [0] => cafe
            [1] => energetico
            [2] => Array
                (
                    [0] => nao
                    [1] => alcoolica
                )
        )
    [1] => Array
        (
            [0] => sofa
        )
)
*/

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

3 comments for “Removendo acentos e outros caracteres de um String

  1. Carlos
    13/06/2016 at 18:23

    Boa Noite Leandro,

    Gostaria de sua ajuda. Estou tomando uma surra pra tirar acentos de um array php. Já testei varias funções encontradas na internet, mas as mesmas só funcionam inserindo uma string e não um array.

    Desde já lhe agradeço pela força.

    Att,

    Carlos

    • lisura
      30/08/2016 at 09:39

      Desculpe a demora para responder.
      Fiz uma atualização no post, acho que isso deve te ajudar a resolver seu problema.
      Obrigado pela sugestão.
      att

  2. Carlos
    28/09/2016 at 16:13

    Muito obrigado Lisura. Valeu mesmo! Parabéns pelo blog.

Leave a Reply

Your email address will not be published. Required fields are marked *