JavaScript:
Como Substituir ou Remover Caracteres Especiais

metring.com.br

Remover pontuações em JavaScript até que é uma tarefa fácil, mas remover acentos, deixando apenas as letras já é um pouco mais complicado. Independente da situação, disponibilizo abaixo algumas funções minimalistas que servem para ambos os casos.

Como remover acentos em JavaScript

Para simplesmente remover acentos e cedilha de uma string e retornar a mesma string sem os acentos, podemos usar o método String.prototype.normalize do ES6, seguido de um String.prototype.replace:

        
        const str = 'ÁÉÍÓÚáéíóúâêîôûàèìòùÇç';
        const parsed = str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
        //console.log(parsed);
        document.write(parsed);
        
        
Resultado: AEIOUaeiouaeiouaeiouCc

Explicação

O método normalize foi introduzido na versão ES6 do JavaScript, em 2015. E serve para converter uma string em seu formato Unicode normalizado. Neste caso utilizamos o parâmetro NFD que é capaz de separar os acentos das letras e retornar seus códigos Unicode.

Para ter uma noção melhor de como funciona essa conversão para Unicode, acompanhe abaixo:

        
        // String Á em UTF-18 tem 1 dígito
        'Á'.length; // 1

        // String Á em Unicode tem 2 dígitos: \u0041\u0301
        'Á'.normalize('NFD').length; // 2

        // Se tentarmos representar Unicode, vamos obter o seguinte resultado
        //console.log('\u0041\u0301'); // Á
        document.write('\u0041\u0301'); 
        
        
Resultado: Á

Em seguida o método replace substitui todas as ocorrências de caracteres diacríticos, combinando-os na sequencia Unicode \u0300 - \u036F, outra vantagem do ES6 que foi adicionada para permitir ranges Unicode em RegEx.

Removendo todos os caracteres especiais em JavaScript

Para remover os acentos e outros caracteres especiais como /.?!(), basta usar a mesma fórmula acima, só que substituir tudo menos letras e números.

        
        const str = 'ÁÉÍÓÚáéíóúâêîôûàèìòùÇç/.,~!@#$%&_-12345';
        const parsed = str.normalize('NFD').replace(/([\u0300-\u036f]|[^0-9a-zA-Z])/g, '');
        //console.log(parsed);
        document.write(parsed);
        
        
Resultado: AEIOUaeiouaeiouaeiouCc

Explicação

Para entender o que acontece no código acima, sugiro ler o parágrafo anterior onde falei sobre o método normalize e Unicode.

A única adição neste caso foi criar 2 grupos no regex através de ([ grupo 1 ]|[ grupo 2 ]) e adicionar ao grupo 2 a expressão regular [^0-9a-zA-Z], que significa: tudo o que não (^) for de 0-9, de a-z ou de A-Z, seja também substituído.

Se você não quiser remover espaços, basta adicionar \s:

        
        //str.normalize('NFD').replace(/([\u0300-\u036f]|[^0-9a-zA-Z\s])/g, '')var x = 'Esta é uma frase'
        x = x.normalize('NFD').replace(/([\u0300-\u036f]|[^0-9a-zA-Z\s])/g, '')
        document.write(x)
        
        
Resultado: Esta e uma frase

Substituindo caracteres especiais

Outro caso de uso bastante recorrente é a necessidade de limpar os acentos e em seguida substituir caracteres especiais por algum outro, exemplo: "Uma frase qualquer" -> "Uma-frase-qualquer".

Existe uma expressão regular muito boa para substituir caracteres que não sejam letras ou números comuns, porém esta expressão também acaba com acentos.

        
        //'Esta é uma frase'.replace(/[^\w\-]+/g, '-'); // Esta-uma-frase
        var x = 'Esta é uma frase'
        x = x.replace(/[^\w\-]+/g, '-'); 
        document.write(x)
        
        
Resultado: Esta-uma-frase

Se quisermos remover somente os acentos e depois substituirmos outros caracteres especiais, precisamos seguir mais ou menos o que foi proposto no primeiro exemplo:

        
        //'Esta é uma frase'.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^\w\-]+/g, '-'); // Esta-e-uma-frase
        var x = 'Esta é uma frase'
        x = x.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^\w\-]+/g, '-');
        document.write(x)
        
        
Resultado: Esta-e-uma-frase

Mas de repente você também precisa substituir hífens desnecessários, como no caso de "Esta é uma frase!!!" virar "Esta-e-uma-frase---".

Uma função completa que remove acentos, substitui caracteres especiais por hífen, também removendo hífens adicionais:

        
        
        const replaceSpecialChars = (str) => {
        return str.normalize('NFD').replace(/[\u0300-\u036f]/g, '') // Remove acentos
        .replace(/([^\w]+|\s+)/g, '-') // Substitui espaço e outros caracteres por hífen
        .replace(/\-\-+/g, '-')	// Substitui multiplos hífens por um único hífen
        .replace(/(^-+|-+$)/, ''); // Remove hífens extras do final ou do inicio da string
        }
        //console.log(replaceSpecialChars('Esta é uma frase!!!'));
        document.write(replaceSpecialChars('Esta é uma frase!!!'));
        
        
Resultado: Esta-e-uma-frase

Se quiser ainda usar essa mesma função para limpar uma URL, basta adicionar um toLowerCase() ao final e está resolvido!

Acho que cobri todos os casos mais recorrentes ao trabalhar com acentos e caracteres especiais em JavaScript. Infelizmente essa é uma dificuldade adicional de qualquer input latino que geralmente não é embutida nas linguagens de programação.



O que você vai ver neste artigo:

blog.dbins.com.br

* Remover acentos com Normalize

* Remover caracteres espeeciais com Expressões Regulares

* Remover acentos e caracteres especiais com Normalize e Expressões Regulares

Remover acentos com Normalize

Se você tem uma string com acentos e deseja remover a acentuação, a partir do JavaScript ES 6 (2015), existe um recurso chamado Normalize que permite substituir acentos por caracteres sem acentuação.

Aqui tem um exemplo:

var nome = "São Paulo";

var nome2 = nome.normalize("NFD").replace(/[^a-zA-Z\s]/g, "");

console.log(nome2); // Sao Paulo

O retorno deste script é "Sao Paulo"

A função "normalize" utiliza a codificação Unicode para converter os caracteres com acentos. A opção NFD é a abreviação de "Normalization Form Canonical Decomposition". Existem outras 3 opções de conversão, que são NFC, NFKC e NFKD. O significado destas abreviações é:

Normalization Form D (NFD) - Canonical Decomposition

Normalization Form C (NFC) - Canonical Decomposition, followed by Canonical Composition

Normalization Form KD (NFKD) - Compatibility Decomposition

Normalization Form KC (NFKC) - Compatibility Decomposition, followed by Canonical Composition

Para saber em detalhes como funcionam estas opções consulte o link a seguir:

Unicode Normalization Forms

Remover caracteres espeeciais com Expressões Regulares

Para remover caracteres especiais, você vai precisar utilizar expressões regulares. Aqui tem um exemplo:

var nome = "2019 (Sao Paulo)";

var nome2 = nome.replace(/[^a-zA-Z\s]/g, "")

console.log(nome2); // Sao Paulo

O retorno deste script também é "Sao Paulo".

Nesta expressão regular, será considerado válido tudo o que tiver letras maiúsculas, minusculas ou espaço. O que for diferente será removido.

Remover acentos e caracteres especiais com Normalize e Expressões Regulares

Você pode combinar a normalização e as expressões regulares para validar tudo de uma vez.

O exemplo abaixo faz a normalização de uma string, mantendo apenas letras, espaços e caracteres sem acentuação.

function remover_acentos_espaco(str) {

    return str.normalize("NFD").replace(/[^a-zA-Z\s]/g, "");

}

console.log(remover_acentos_espaco("São Paulo")); // Sao Paulo

Encerramento

Neste artigo você viu como remover acentos e caracteres especiais utilizando JavaScript

Se você deseja mais dicas sobre como trabalhar com expressões regulares no JavaScript eu recomendo que você veja este artigo: