代码之家  ›  专栏  ›  技术社区  ›  Jim Neath

Ruby、GSUB和Regex

  •  9
  • Jim Neath  · 技术社区  · 15 年前

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

    任何帮助都是了不起的。

    2 回复  |  直到 15 年前
        1
  •  13
  •   Pinochle    15 年前

    如果索引总是以单词边界结尾,则可以匹配:

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

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

        2
  •  22
  •   sepp2k    15 年前

    您不必先提取ID,然后再替换它们,只需一次查找和替换即可:

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

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

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