如何使用正则表达式转换Markdown格式的链接?

17

我正在尝试编写一个正则表达式来替换Markdown风格的链接,但似乎无法正常工作。目前我的正则表达式如下:

# ruby code:
text = "[link me up](http://www.example.com)"
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>})

我做错了什么?


为什么不使用完整的Ruby Markdown库,比如非常棒的kramdown - Phrogz
因为我只需要一小部分的Markdown功能,并且没有找到一个允许我指定要支持哪些功能的库(所以我不得不自己编写)。 - Andrew
1个回答

42
irb(main):001:0> text = "[link me up](http://www.example.com)"
irb(main):002:0> text.gsub /\[([^\]]+)\]\(([^)]+)\)/, '<a href="\2">\1</a>'
#=> "<a href=\"http://www.example.com\">link me up</a>"
我们可以使用Ruby的扩展选项来使正则表达式看起来不像猫在键盘上跳跃:

我们可以使用 Ruby 的扩展选项来让正则表达式看起来更加规范:

def linkup( str )
  str.gsub %r{
    \[         # Literal opening bracket
      (        # Capture what we find in here
        [^\]]+ # One or more characters other than close bracket
      )        # Stop capturing
    \]         # Literal closing bracket
    \(         # Literal opening parenthesis
      (        # Capture what we find in here
        [^)]+  # One or more characters other than close parenthesis
      )        # Stop capturing
    \)         # Literal closing parenthesis
  }x, '<a href="\2">\1</a>'
end

text = "[link me up](http://www.example.com)"
puts linkup(text)
#=> <a href="http://www.example.com">link me up</a>
请注意,上述方法无法处理URL中包含右括号的情况,例如:
linkup "[O](http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85).aspx)"
# <a href="http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85">O</a>.aspx)
如果这对你很重要,你可以用 \S+(?=\))替换[^)]+,它表示"尽可能多地查找非空格字符,但确保后面有一个)"
为了回答你的问题"我做错了什么",以下是你的正则表达式所表示的意思:
%r{
  \[      # Literal opening bracket   (good)
    (     # Start capturing           (good)
      \+  # A literal plus character  (OOPS)
    )     # Stop capturing            (good)
  \]      # Literal closing bracket   (good)
  \(      # Literal opening paren     (good)
    (     # Start capturing           (good)
      \+  # A literal plus character  (OOPS)
    )     # Stop capturing            (good)
  \)      # Literal closing paren     (good)
}x

1
另外,我从未见过带有括号的URL。我甚至认为这是无效的。感谢您指出。 - Andrew
3
支持类似 [链接](http://example.com "提示信息") 的工具提示,可以使用此正则表达式:/\[([^\]]+)\]\(([^)"]+)(?: \"([^\"]+)\")?\)/ - nfvs
只是想指出,根据常见的标记规范,URL 中的开放和关闭括号是允许的。因此,像 http://example.com?query[]=something 这样的 URL 应该是允许的,但提供的正则表达式没有考虑到这一点。 - thatidiotguy
1
@thatidiotguy 不正确。正则表达式防止链接文本中的闭合括号,但不防止在URL中出现。例如,请参见http://rubular.com/r/kG7s9bHlOl。 - Phrogz
@étale-cohomology 你有看到我回答中的这一部分吗,_“请注意,上述方法对于URL中含有右括号的情况会失败”_?然后你又有没有看到回答中开始的那一部分,_“如果这对你很重要…”_? - Phrogz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接