9

快速背景:我有一个包含对其他页面的引用的字符串。这些页面使用以下格式链接:“#12”。后跟页面 ID 的哈希值。

假设我有以下字符串:

str = 'This string links to the pages #12 and #125'

我已经知道需要链接的页面的 ID:

page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]

如何遍历页面 ID 并将 #12 和 #125 链接到各自的页面?我遇到的问题是如果我执行以下操作(在 rails 中):

page_ids.each do |id|
  str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end

这适用于#12,但它将#125 的“12”部分链接到 ID 为 12 的页面。

任何帮助都是极好的。

4

2 回答 2

22

无需先提取 id 然后替换它们,您可以简单地一次性找到并替换它们:

str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }

即使您因为在其他地方也需要 id 而不能省略提取步骤,但这应该会快得多,因为它不必遍历每个 id 的整个字符串。

PS:如果str没有从其他任何地方引用,您可以使用str.gsub!而不是str = str.gsub

于 2009-08-17T13:07:37.703 回答
14

如果您的索引始终以单词边界结尾,则可以匹配:

page_ids.each do |id|
  str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end

您只需要\b在搜索模式上添加单词边界符号,替换模式不需要。

于 2009-08-17T12:41:28.930 回答