web-dev-qa-db-fra.com

Supprimer tous les caractères spéciaux avec RegEx

Je voudrais un RegExp qui supprimera tous les caractères spéciaux d'une chaîne. J'essaie quelque chose comme ça mais cela ne fonctionne pas dans IE7, bien 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 RegExp serait également utile.

204
Timothy Ruhle
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

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

Le caractère caret (^) est la négation de l'ensemble [...], gi dit global et insensible à la casse (ce dernier est un peu redondant mais je voulais le mentionner) et le safelist Dans cet exemple, les chiffres, les caractères Word, les traits de soulignement (\w) et les espaces (\s).

561
annakata

Notez que si vous souhaitez toujours exclure un jeu, notamment des barres obliques et des caractères spéciaux, vous pouvez procéder comme suit:

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

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

87
noinput

Les expressions rationnelles Javascript simples ne gèrent pas les lettres Unicode .

N'utilisez pas [^\w\s], cela enlèvera les lettres avec des accents (comme àèéìòù), sans parler du cyrillique ou du chinois, les lettres provenant de ces langues seront complétées supprimées.

Vous ne voulez vraiment pas supprimer ces lettres avec tous les caractères spéciaux. Vous avez deux chances:

  • Ajoutez dans votre regex tous les caractères spéciaux que vous ne voulez pas supprimer,
    par exemple: [^èéòàùì\w\s].
  • Regardez xregexp.com . XRegExp ajoute un support de base pour la correspondance Unicode via la syntaxe \p{...}.
var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>
19
freedev

La première solution ne fonctionne pour aucun alphabet UTF-8. (Il coupera un 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).

7
Seagull

J'utilise RegexBuddy pour déboguer mes regex, il a presque toutes les langues très utiles. Que copier/coller pour la langue ciblée. Outil formidable et pas très cher.

Donc, j'ai copié/collé votre regex et votre problème est que [] sont des caractères spéciaux dans une regex, vous devez donc les échapper. La regex devrait donc être:

1
millebii

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "") je l'ai fait comme ça. Mais il y a des gens qui l'ont fait beaucoup plus facilement comme str.replace(/\W_/g,"");

1
Eldar Mammadov

pourquoi ne faites-vous pas quelque chose comme:

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

pour vérifier si votre entrée contient des caractères spéciaux

0
AnD