2009-04-10 103 views
44

我正在练习Ruby和正则表达式来删除某些不需要的字符。例如:如何删除特殊字符?

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

和特殊字符,例如☻或™:

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

这样,只有数字,确定。但是,如果用户输入特殊字符作为密码,这样才能这样:

&#153; 

我的问题: 如何,如果用户输入特殊字符不代码,这样我可以删除特殊字符:

™ ☻ 

回答

104

首先,我认为可能更容易定义什么构成“正确的输入”并删除其他所有内容。例如:

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

如果这不是你想要的(要支持非拉丁字母,等等),那么我认为你应该让你想删除(如™或字形的列表☻ ),并逐个删除它们,因为很难以编程方式区分中文,阿拉伯文等字符和象形文字。

最后,您可能希望通过转换为HTML转义序列或从HTML转义序列转换来标准化您的输入。

+0

谢谢,我认为创建允许的字符列表更容易。 – Yud 2009-04-10 12:45:51

+0

谢谢!我使用了`input = input.gsub(/ [^ 0-9A-Za-z] /,'')`来保持字符串不变。它在这些特殊字符的位置给了我一些额外的空间。 – Surya 2012-04-30 12:52:29

8

可以匹配所有你想要的字符,然后加入他们在一起,像这样:

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

哪个输出​​

10

如果你只是想ASCII字符,那么你可以使用:

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

一个更简单的方式来做到由灿伯克Güder回答这个inspirated是:

为了删除特殊字符:

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

为了保持单词字符:

input = input.scan(/\w/) 

在最后输入是一样的!试试看:http://rubular.com/