多个 `each` 循环中的多个 `gsub` 被另一个循环覆盖

Multiple `gsub` in multiple `each` loops getting overriden one by another

尝试遍历一些短语,每当我找到一个词时,我需要将其替换为 link。

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 <a href='<a href='world'>world</a>'><a href='world'>world</a></a><br /><a href='<a href='world'>world</a>'><a href='world'>world</a></a>wide"

在第一个 运行 中,它找到所有出现的 world,但在第二个中,它再次进入生成的 <a href="#world">world</a>gsub

另一个问题是正确的正则表达式只能按边界查找单词,我认为它会是 /\b(word)\b,但那没有用。

有什么指点吗?

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

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" 字符串。并且(我 认为 这就是你想要的?)你可以在 search/replace 项之间定义一些 映射 而不是循环两次,避免重复替换。