313 votes

Supprimer tous les caractères spéciaux avec RegExp

Je voudrais un RegExp qui supprime tous les caractères spéciaux d'une chaîne de caractères. J'essaie quelque chose comme ça, mais cela ne fonctionne pas dans IE7, alors que cela fonctionne dans Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

Une description détaillée de la RegExp serait également utile.

22 votes

Il serait préférable d'établir une liste blanche plutôt qu'une liste noire. Il suffirait alors de faire [a-z]|[0-9]|. \s

1 votes

Une erreur de script ? Avez-vous débogué ? Ou alors mettez un bloc try...catch dans le code javascript.

1 votes

@ Ape-inago pouvez-vous m'expliquer un peu plus RegExp s'il vous plaît.

759voto

annakata Points 42676
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

Comme cela a été mentionné dans les commentaires, il est plus facile de faire cela en tant que liste blanche - remplacer les caractères qui ne sont pas dans votre liste de sécurité.

Le signe d'insertion ( ^ ) est la négation de l'ensemble [...] , gi sont globales et insensibles à la casse (ce dernier point est un peu redondant mais je tenais à le mentionner) et la liste de sécurité dans cet exemple est constituée de chiffres, de caractères de mot, de caractères de soulignement ( \w ) et les espaces ( \s ).

81 votes

Cette solution ne fonctionne pas pour les symboles non anglais. "" par exemple.

8 votes

Vous pouvez également utiliser les majuscules \W au lieu de ^ \w. \W : Correspond à tout caractère autre qu'un mot. Équivalent à [^A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/

0 votes

@Seagull J'ai ajouté une réponse qui gère les Unicodes.

170voto

noinput Points 79

Notez que si vous souhaitez toujours exclure un ensemble, y compris des éléments comme les barres obliques et les caractères spéciaux, vous pouvez procéder comme suit :

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

Notez que pour inclure également le caractère "moins", vous devez l'échapper avec une barre oblique inverse comme le dernier groupe. Si vous ne le faites pas, il sélectionnera également 0-9, ce qui est probablement indésirable.

21 votes

excellente solution ! la réponse acceptée ne fonctionne qu'en anglais, celle-ci fonctionne dans toutes les langues (pour autant que j'aie vérifié). merci :)

1 votes

@knutole supprimer le ? de la partie jeu de caractères vers l'avant. Il s'agit de la liste des caractères que vous souhaitez supprimer, de sorte que le fait de ne pas les supprimer les inclura dans le résultat final.

0 votes

Cela fonctionne très bien, s'adapte parfaitement à toutes les langues, il suffit d'ajouter le caractère que vous voulez remplacer et c'est tout. Merci.

11voto

Seagull Points 1222

La première solution ne fonctionne pour aucun alphabet UTF-8. (Elle coupe le texte tel que ). J'ai réussi à créer une fonction qui n'utilise pas RegExp et qui 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, c'est un caractère spécial. La seule exception est faite pour 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 où il y a des lettres minuscules et majuscules. 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 les caractères spéciaux pour mettre en œuvre une fonctionnalité de recherche, il existe une meilleure approche. Utilisez n'importe quel bibliothèque de translittération qui vous produira une chaîne de caractères uniquement à partir de caractères latins et ensuite la simple Regexp fera toute la magie de la suppression des caractères spéciaux. (Cela fonctionnera également pour le chinois et vous obtiendrez également des avantages secondaires en faisant de la Tromsø == Tromso ).

0 votes

Excellent, j'aime cette réponse ! Je l'utilise pour créer un nom de fichier valide et j'ai étendu votre solution pour supprimer les espaces (compatible Linux/Unix) et autoriser les nombres également. J'ai donc étendu l'instruction if (jQuery impliqué) : if(str[i] !== ' ' && (lower[i] != upper[i] || lower[i].trim() === '' || $.isNumeric(str[i]))))

0 votes

dans de nombreuses langues, il n'y a pas de lettres majuscules... par conséquent, la fonction considérera les entrées valides comme des caractères spéciaux.

0 votes

Les caractères chinois, par exemple, sont supprimés par ce système.

2voto

millebii Points 920

J'utilise RegexBuddy pour déboguer mes regex, il possède presque toutes les langues et est très utile. Il suffit de faire un copier/coller pour la langue ciblée. Un outil formidable et pas très cher.

J'ai donc copié/collé votre regex et votre problème est que [,] sont des caractères spéciaux dans la regex, donc vous devez les échapper. Donc la regex devrait être : /!@#$^&%*()+=-[ \x5B\x5D ]\/{}|:<> ?,./im

-1voto

AnD Points 500

pourquoi ne pas faire quelque chose comme :

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

pour vérifier si votre entrée contient un caractère spécial

21 votes

L'OP dit qu'il essaie de supprimer les caractères spéciaux et non de voir s'ils existent.

0 votes

Il s'agit d'une bonne solution, mais elle n'autorise que les lettres, les chiffres et les espaces de l'alphabet anglais, mais elle supprime les caractères tels que èéòàùì et dans certains cas, ce ne sera pas la solution

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X