多个 `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 项之间定义一些 映射 而不是循环两次,避免重复替换。
尝试遍历一些短语,每当我找到一个词时,我需要将其替换为 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 项之间定义一些 映射 而不是循环两次,避免重复替换。