【问题标题】:Ruby - Deleting every word from an arrayRuby - 从数组中删除每个单词
【发布时间】:2014-08-04 17:19:39
【问题描述】:

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

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

如果用户键入了这些,我希望它们被删除。这是我尝试过的一件事。

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

感谢您的帮助。

【问题讨论】:

  • gsub改成gsub!修改字符串对象。
  • 你想在实践中做什么?您想在输入单词时突出显示该单词以警告作者吗?字符串保存时要删除单词吗?
  • August 评论的更多细节:gsub() 返回一个新字符串,您不对其进行任何操作,因此 ruby​​ 丢弃了新字符串,而旧字符串保持不变。 Ruby 有很多方法的“bang”形式,bang(!) 是一个警告,即调用该方法的对象“receiver”将被更改。
  • 我的目标是删除输入时的单词。除非是在创建用户名,否则我会使用 validates_exclusion of 警告他们。
  • 我建议你把标题从“从数组中删除每个单词”改为“从字符串中删除某些单词”。

标签: ruby arrays string gsub


【解决方案1】:

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

https://github.com/tjackiw/obscenity

包含 gem 将允许您使用以下方法:

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

然后:

Obscenity.sanitize(string)

【讨论】:

  • 太棒了,我去看看。但通常,语言过滤器是不完善的,很容易绕过。感谢您的建议
  • DarkMouse,你说的是真的,但这也是你自己不滚动的理由。
【解决方案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"
  • (?&lt;=^|\W) 是一个积极的回顾
  • (?=\W|$) 是一个积极的前瞻性

坏、邪恶和可怕的词会偷偷溜走吗?当然。 orig_str 的一些示例:

badbadbad
evilterribleenemy
eviloff
flyingevil

祝你好运!

【讨论】:

    【解决方案3】:

    你可以这样做

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

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

    您的原件应该工作的问题是它返回了一个新字符串,而不是像我上面提出的解决方案那样修改旧字符串。

    【讨论】:

    • 不敢相信我忘记了 bang 方法,修改原始字符串。无论如何,我决定使用第二个选项,更少的代码,更干净。谢谢。
    • @DarkMouse 如果你认为这对你来说是正确的答案,我建议你接受它。
    • Shane,如果你在我的回答中用orig_str 试试这个,结果是"Evil is embodied by a named 'Bad' who plays mitten"
    • 将 gsub() 的返回值赋给一个变量,然后对变量不做任何事情---对原始字符串不做任何事情。
    • @7stud,因为变量是string,这不是很好吗,它已经被定义并正在被执行?
    【解决方案4】:

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

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

    【讨论】:

    • Uri,如果您在我的回答中针对orig_str 运行此命令,您将得到"Evil is embodied in a named 'Bad' who plays mitten"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多