Ruby - 删除数组中的每个单词

时间:2014-08-04 17:19:40

标签: ruby arrays string gsub

在我的应用中,我必须监控用户输入的内容。所以我必须防止来自网站的任何不好的话。例如,假设我的所有坏词都在这个数组中。

bad_words = ['bad', 'evil', 'terrible', 'villain', 'enemy']

如果用户输入了这些内容,我希望将其删除。这是我尝试过的一件事。

bad_words.each {|word| string.gsub(word, '')}

非常感谢帮助。

4 个答案:

答案 0 :(得分:3)

您可以使用Gem来完成清洁工作:

https://github.com/tjackiw/obscenity

包含gem的

将允许您使用以下方法:

Obscenity.configure { |config| config.whitelist = bad_words }

然后:

Obscenity.sanitize(string)

答案 1 :(得分:2)

你可以做

bad_words.each {|word| string = string.gsub(word, '')}

bad_words.each {|word| string.gsub!(word, '')}

要么你的原始作品有问题,那就是它正在返回一个新的字符串而不是修改旧的字符串,就像我上面提到的解决方案一样。

答案 2 :(得分:2)

这是一种方式:

bad_words = ['bad', 'evil', 'terrible', 'villain', 'enemy']
orig_str =
  "Evil is embodied by a terrible villain named 'Bad' who plays badmitten"

no_bad_str = orig_str.gsub(/(?<=^|\W)\w+(?=\W|$)/) { |w|
               (bad_words.include?(w.downcase)) ? '' : w }
  #=> " is embodied by a   named '' who plays badmitten"
  • (?<=^|\W)是一个积极的背后隐藏
  • (?=\W|$)是一个积极的向前看

可恶的,邪恶的和可怕的话可以潜行吗?当然。 orig_str的一些示例:

badbadbad
evilterribleenemy
eviloff
flyingevil
祝你好运!

答案 3 :(得分:1)

您可以使用Regexp.union创建包含您列表中所有字词的正则表达式:

bad_words = ['bad', 'evil', 'terrible', 'villain', 'enemy']
Regexp.union(bad_words)
# => /bad|evil|terrible|villain|enemy/
string.gsub(Regexp.union(bad_words), '')