【问题标题】:Multiple `gsub` in multiple `each` loops getting overriden one by another多个“每个”循环中的多个“gsub”被另一个覆盖
【发布时间】:2016-06-15 16:01:24
【问题描述】:

尝试迭代一些短语,每当我找到一个单词时,我需要用一个链接替换它。

phrases = ["hello world", "worldwide"]
words_to_link = ["world", "world"]

我想得到:

"hello <a href='world'>world</a><br />worldwide"

我的代码是:

phrases.each do |ph|
  words_to_link.each do |w|
    ph.gsub!(w, "<a href='#{w}'>#{w}</a>")
  end
end.join("<br />").html_safe

这个的输出是:

"hello &lt;a href='&lt;a href='world'&gt;world&lt;/a&gt;'&gt;&lt;a href='world'&gt;world&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href='&lt;a href='world'&gt;world&lt;/a&gt;'&gt;&lt;a href='world'&gt;world&lt;/a&gt;&lt;/a&gt;wide"

在第一次运行时,它会找到所有出现的 world,但在第二次运行时,它再次进入生成的 &lt;a href="#world"&gt;world&lt;/a&gt;gsubs。

另一个问题是正确的正则表达式只能按边界查找单词,我以为是/\b(word)\b,但这不起作用。

任何指针?

【问题讨论】:

  • 在这个例子中,您似乎可以将words_to_link 数组更改为只有一个元素。目前它有两次相同的单词。
  • 是的,这是一个简化的例子,但是数组可以有重复
  • 如果数组有重复,这似乎行不通。
  • 是否有另一种方法来处理这种多重替换 @maxpleaner ?
  • rubular.com 上试用正则表达式。我认为发布的答案是一个好方法。不确定单词边界问题。

标签: ruby-on-rails ruby regex gsub


【解决方案1】:

我对你的问题有点困惑,所以这里可能搞错了。但是,这是我的解释的答案:

phrases = ["hello world", "worldwide"] 
substitutions = { /\bworld\b/ => "world" } 

phrases.each do |ph| 
  substitutions.each do |pattern, replacement| 
    ph.gsub!(pattern, "<a href='#{replacement}'>#{replacement}</a>") 
  end 
end

phrases.join("<br />").html_safe

您可以在正则表达式中使用\b 来标记工作边界,以避免更改"worldwide" 字符串。而且(我认为这就是您想要的?)您可以在搜索/替换术语之间定义一些映射,而不是循环两次,以避免双重替换。

【讨论】:

  • 感谢您提供正则表达式位,我将反思您发布的代码,以便更多地围绕它翻转我的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2015-04-28
相关资源
最近更新 更多