2010-12-07 4 views
155

Je voudrais un RegExp qui supprimera tous les caractères spéciaux d'une chaîne. J'essaye quelque chose comme ceci mais cela ne fonctionne pas dans IE7, bien que cela fonctionne dans Firefox.Supprimer tous les caractères spéciaux avec RegExp

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

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.

+15

Quelque chose comme ceci serait mieux comme une liste blanche, pas une liste noire. alors vous pouvez juste faire [a-z] | [0-9] | \ s –

+0

Une erreur de script? Avez-vous débogué? Ou bien essayez un bloc catch dans le code javascript. – Kangkan

+0

@ Ape-inago pouvez-vous s'il vous plaît expliquer RegExp un peu plus pour moi s'il vous plaît –

Répondre

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

Comme nous l'avons 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 safari.

Le caret (^) caractère est la négation de l'ensemble [...], gi dire globale et insensible à la casse (ce dernier est un peu redondant, mais je voulais le mentionner) et le safelist dans cet exemple est des chiffres, des caractères de mot , souligne (\w) et espace (\s).

+1

Merci pour l'explication aide beaucoup. Fonctionne bien aussi. Deux pouces en l'air de ma part!! –

+1

Fonctionne très bien. Merci! – Joop

+1

excellente approche UPVOTED! :) –

1

J'utilise RegexBuddy pour debbuging mes regexes il a presque toutes les langues très utile. Que copier/coller pour la langue ciblée. Super outil et pas très cher.

Je copier/coller votre regex et votre problème est que [,] sont des caractères spéciaux dans regex, donc vous devez les échapper. Ainsi, le regex devrait être:/@ # $^&% *() + = - [\ X5B \ X5D] \/{} |:?. <>,/im

+2

Cela devrait être un commentaire, pas une réponse. –

+5

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

+0

Cela m'a donné mon rire le plus fort de la journée; –

1

pourquoi ne pas vous faire quelque chose comme:

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

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

+11

L'OP dit qu'il essaie de supprimer les caractères spéciaux ne pas voir s'ils existent. – annakata

61

Notez que si vous voulez toujours exclure un ensemble, y compris des choses comme des barres obliques et des caractères spéciaux vous peut effectuer les opérations suivantes:

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

prendre note spéciale afin d'inclure également le caractère « moins », vous devez échapper avec une barre oblique inverse comme celui-ci gro en haut Si vous ne le faites pas, il sélectionnera également 0-9, ce qui est probablement indésirable.

+8

excellente solution! la réponse acceptée ne fonctionne qu'en anglais, cela fonctionne sur toutes les langues (pour autant que j'ai vérifié). merci :) –

+2

comment puis-je ajouter '-'? – knutole

+1

@knutole supprime le '?' De la partie du jeu de caractères vers l'avant. ceci liste les caractères que vous voulez enlever, ainsi l'excluant d'être dépouillé l'inclura intrinsèquement dans le résultat final. – noinput

-9

utilisation regex ^[^/\\()[email protected]#$%^&*{«»„““”‘’|\n\t….,;`^"<>'}+:?®©]*$

+6

Il vaudrait mieux que vous développiez cette réponse pour expliquer * pourquoi * cette expression régulière est une solution à la question, et pour en expliquer le fonctionnement. – Matt

3

La première solution ne fonctionne pas pour tout UTF-8 alphaben. (Il coupera le 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 le symbole est égal en majuscule et en minuscule c'est un caractère spécial. La seule exception est faite pour les espaces.

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; 
} 
+0

Excellent, comme cette réponse! Je l'utilise pour créer un nom de fichier valide et l'ai étendu votre solution pour supprimer des espaces (compatible Linux/Unix) et autoriser des nombres aussi bien. J'ai donc étendu l'instruction if (jQuery impliquée): if (str [i]! == '' && (inférieur [i]! = Supérieur [i] || inférieur [i] .trim() === '' | | $.isNumeric (str [i]))) – Jonny

8

Plaine Javascript regex ne gère pas les lettres Unicode. N'utilisez pas [^\w\s], cela supprimera les lettres avec des accents (comme àèéìòù), pas de mentions cyrilliques ou chinoises, ces lettres de langue seront complétées enlevées.

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

  • Ajouter dans votre regex tous les caractères spéciaux que vous ne voulez pas supprimer,
    par exemple: [^èéòàùì\w\s].
  • Jetez un oeil à xregexp.com. XRegExp ajoute le 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>

+1

Bon à savoir pour l'internationalisation, je n'avais aucune idée JS regex n'était pas UTF-8 occupé. – LessQuesar

+0

Vous ne pouvez pas mettre toutes les lettres UTF-8 valides dans var str – Seagull

+0

@Seagull oui, mais au cas où vous n'êtes pas écrire une application compatible avec le monde entier, vous pouvez pragmatiquement mettre seulement la liste des lettres UTF-8 valides pour vos localisations actuelles . Dans mon cas, pour la langue italienne, il n'y a que peu de lettres. – freedev

0

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

+0

La plupart des choses dans votre approche sont redondantes, puisque '\ W' contient certains des caractères. Mais pourquoi filtreriez-vous les nombres? Ce ne sont pas des caractères spéciaux. – Xufox

Questions connexes