2009-04-10 14 views
44

Je m'entraîne avec Ruby et regex pour supprimer certains caractères indésirables. Par exemple:Comment puis-je supprimer des caractères spéciaux?

input = input.gsub(/<\/?[^>]*>/, '') 

et des caractères spéciaux, par exemple ☻ ou ™:

input = input.gsub('&#', '') 

Cela laisse des chiffres, ok. Mais cela ne fonctionne que si l'utilisateur entre un caractère spécial comme un code, comme ceci:

&#153; 

Ma question: Comment puis-je supprimer des caractères spéciaux si l'utilisateur entre un caractère spécial sans code, comme ceci:

™ ☻ 

Répondre

104

Tout d'abord, je pense qu'il pourrait être plus facile de définir ce qui constitue une "entrée correcte" et de supprimer tout le reste. Par exemple:

input = input.gsub(/[^0-9A-Za-z]/, '') 

Si ce n'est pas ce que vous voulez (vous voulez soutenir alphabets non latins, etc.), alors je pense que vous devriez faire une liste des glyphes que vous souhaitez supprimer (comme ™ ou ☻), et les supprimer un par un, car il est difficile de distinguer entre un caractère chinois, arabe, etc et un pictogramme par programme. Enfin, vous pouvez vouloir normaliser votre entrée en convertissant vers ou à partir de séquences d'échappement HTML.

+0

Merci, je pense qu'il est plus facile de créer une liste de caractères autorisés. – Yud

+0

Merci! J'ai utilisé 'input = input.gsub (/ [^ 0-9A-Za-z] /, '')' pour garder la chaîne telle quelle. Cela me donne des espaces supplémentaires à la place de ces caractères spéciaux. – Surya

8

vous pouvez faire correspondre tous les caractères que vous voulez, puis les réunir, comme ceci:

original = "aøbæcå" 
stripped = original.scan(/[a-zA-Z]/).to_s 
puts stripped 

qui produit "abc"

10

Si vous voulez que les caractères ASCII, vous pouvez utiliser:

original = "aøbauhrhræoeuacå" 
cleaned = "" 
original.each_byte { |x| cleaned << x unless x > 127 } 
cleaned # => "abauhrhroeuac" 
7

Vous pouvez utiliser parameterize:

'@!#$%^&*()111'.parameterize 
=> "111" 
+0

S'il vous plaît modifier votre réponse pour ajouter une explication de la façon dont votre code fonctionne et comment il résout le problème du PO. Beaucoup d'affiches sont des débutants et ne comprendront pas le code que vous avez posté. –

+0

Doc there: http://apidock.com/rails/String/parameterize –

+0

Gotcha avec paramétrer: Il laisse des tirets. J'utilise 'quelque chose-ici'.underscore.parameterize pour en rendre compte. – emptywalls

3

Un moyen plus facile de le faire Inspiré du Can Berk Güder réponse est:

Afin de supprimer les caractères spéciaux:

input = input.gsub(/\W/, '') 

Afin de garder les caractères de mot:

input = input.scan(/\w/) 

A l'entrée est le même! Essayez-le sur: http://rubular.com/

Questions connexes