ruby-on-rails - Ruby、gsub 和正则表达式

标签 ruby-on-rails ruby regex gsub

快速背景:我有一个字符串,其中包含对其他页面的引用。这些页面使用格式链接到:“#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 的页面。

任何帮助都会很棒。

最佳答案

无需先提取 ID 然后替换它们,您只需一次找到并替换它们:

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

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

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

关于ruby-on-rails - Ruby、gsub 和正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1287630/

相关文章:

ruby-on-rails - Rails 预览更新关联而不保存到数据库

mysql - 为什么 ActiveRecord 在从数组中删除对象时要尝试删除与对象对应的行?

ruby-on-rails - 如何为已经建立的模型创建脚手架

javascript - 正则表达式 JavaScript 重叠匹配

python - 如何在 Python 中将字符串元素插入到正则表达式中?

PHP/Django/Rails/Flex 混合演示 - 需要项目创意

ruby - Watir 文件上传窗口阻止进一步重定向

ruby - 如何从 C 扩展将关键字传递到 Ruby 方法?

ruby-on-rails - Ruby,如何使用 MIME 多部分正确解码邮件?

c# - 正则表达式.替换 : replace only first one found