web-dev-qa-db-fra.com

Supprimer tous les caractères spéciaux sauf l'espace d'une chaîne en utilisant JavaScript

Je souhaite supprimer tous les caractères spéciaux, à l'exception de l'espace, d'une chaîne à l'aide de JavaScript.

Par exemple, abc's test#s doit être généré sous la forme abcs tests.

115
nithi

Vous devriez utiliser la fonction de remplacement de chaîne, avec une seule expression rationnelle. En supposant par caractères spéciaux, vous entendez tout ce qui n'est pas une lettre, voici une solution:

var str = "abc's test#s";
alert(str.replace(/[^a-zA-Z ]/g, ""));
274
Petar Ivanov

Vous pouvez le faire en spécifiant les caractères que vous souhaitez supprimer:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

Sinon, pour changer tous les caractères sauf les chiffres et les lettres, essayez:

string = string.replace(/[^a-zA-Z0-9]/g, '');
101

La première solution ne fonctionne pour aucun alphabet UTF-8. (Il coupera du texte tel que Привіт). J'ai réussi à créer une fonction qui n'utilise pas RegExp et utilise un bon support UTF-8 dans le moteur JavaScript. L'idée est simple si un symbole est égal en majuscule et en minuscule, il s'agit d'un caractère spécial. La seule exception concerne les espaces blancs.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Mise à jour: Veuillez noter que cette solution ne fonctionne que pour les langues dans lesquelles les lettres majuscules et minuscules sont présentes. Dans des langues comme le chinois, cela ne fonctionnera pas.

Mise à jour 2: Je suis arrivé à la solution originale lorsque je travaillais sur une recherche floue. Si vous essayez également de supprimer des caractères spéciaux pour implémenter la fonctionnalité de recherche, il existe une meilleure approche. Utilisez n’importe quelle bibliothèque de translittération qui ne produira votre chaîne que de caractères latins, puis l’Expression rationnelle simple fera tout le tour de magie de la suppression des caractères spéciaux. (Cela fonctionnera aussi pour le chinois et vous recevrez également des avantages en faisant Tromsø == Tromso).

27
Seagull

Je ne connais pas JavaScript, mais est-il possible d'utiliser regex?

Quelque chose comme [^\w\d\s] correspondra à tout sauf aux chiffres, aux caractères et aux espaces. Il serait juste une question pour trouver la syntaxe en JavaScript.

9
Thiago Moraes

J'ai essayé la solution très créative de Seagul, mais j'ai constaté qu'elle traitait également les chiffres comme des caractères spéciaux, ce qui ne répondait pas à mes besoins. Alors voici ma solution (sécurité) de Tweak of Seagul ...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
8
Mozfet

rechercher tous non (caractères de mot | espace):

str.replace(/[^\w ]/, '')
3
dovid

point (.) peut ne pas être considéré comme spécial. J'ai ajouté une condition OR à la réponse de Mozfet & Seagull:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
0
hassanf1