【问题标题】:Search and replace own markups搜索和替换自己的标记
【发布时间】:2014-05-15 04:40:59
【问题描述】:

我在 Rails 中有一个博客,我想在其中规范化内容部分中的外部链接,例如跟踪点击、断开的链接等。

我已经开始创建自己的标记类型,我在其中使用以下内容:

block_code = [[LINK_A##URL:http://www.exampleA.com##ANCHOR:A]]
block_code = [[LINK_B##URL:http://www.exampleB.com##ANCHOR:B]]

这些字符串/标记的解释非常容易(因为我自己指定了它们)以便提取有关它是LINK_A 还是LINK_B 的信息以及URL 值。我用一个函数来做这个:

render_markup(block_code) #=> "<a href='http://www.exampleA.com'>A</a>"

我现在需要做的是拥有一个迭代文本的函数,当它找到我的 block_codes 时,将它们替换为 render_markup() 的结果。

example_content = "Today was a really nice day when I went to the [[LINK_A##URL:http://www.thepark.com##ANCHOR:The park]] where I had a [[LINK_B##URL:http://www.swim.com##ANCHOR:swim]] and this was very nice"

所以当我这样做时:

scan_and_replace(example_content)

它创建:

"Today was a really nice day when I went to the <a href='http://www.thepark.com'>the park</a> where I had a <a href='http://swim.com'>swim</a> and this was very nice."

每当它在文本中遇到我的代码块时。

所以,我需要帮助的是查找和替换这些代码块,即创建 scan_and_replace() 函数。我不需要帮助将我的代码块渲染成 HTML,这已经在工作了。

如果这太难了,或者如果你发现这个方法真的很糟糕(并且知道解决同样问题的更好方法),请告诉我!

【问题讨论】:

    标签: html ruby-on-rails string


    【解决方案1】:

    您可以简单地使用 gsub 将标记替换为链接,如下所示。 这里唯一困难的部分是正则表达式/\[\[.*?##URL:(.*?)##ANCHOR:(.*?)\]\]/,这意味着'搜索字符[[并将组分隔符()之间的所有内容分配给$1,将第二组中的所有内容分配给$2,并在每次匹配时调用渲染函数。

    def render_markup url, anchor
      "<a href='#{url}'>#{anchor}</a>"
    end
    
    def scan_and_replace content
      content.gsub(/\[\[.*?##URL:(.*?)##ANCHOR:(.*?)\]\]/){|m| render_markup($1, $2) }
    end
    
    example_content = "Today was a really nice day when I went to the [[LINK_A##URL:http://www.thepark.com##ANCHOR:The park]] where I had a [[LINK_B##URL:http://www.swim.com##ANCHOR:swim]] and this was very nice"
    puts scan_and_replace example_content
    
    #=>Today was a really nice day when I went to the <a href='http://www.thepark.com'>The park</a> where I had a <a href='http://www.swim.com'>swim</a> and this was very nice
    

    【讨论】:

    • 实际上,它并没有真正起作用。只有您的示例有效(尝试返回“block_code”,您会看到)。在 render_markup 中,属性 block_code 为 nil。基本上,render_markup($1) 不会将任何东西作为 $1 发送。你有什么想法可以让它发挥作用吗...
    • 对不起,我应该使用 gsub 的块形式,请参阅stackoverflow.com/questions/288573/1-and-1-in-ruby 以获得解释,我调整了我的答案,我也实现了你的渲染功能以确保
    • 这是正确的。最后,我将您的答案改编为使用 content.scan,有点难看,但更符合我的目的。谢谢!
    猜你喜欢
    • 2015-01-09
    • 2021-05-25
    • 2015-04-02
    • 1970-01-01
    • 2020-07-20
    • 2017-09-10
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多