我正在尝试编写一个正则表达式来替换Markdown风格的链接,但似乎无法正常工作。目前我的正则表达式如下:
# ruby code:
text = "[link me up](http://www.example.com)"
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>})
我做错了什么?
我正在尝试编写一个正则表达式来替换Markdown风格的链接,但似乎无法正常工作。目前我的正则表达式如下:
# ruby code:
text = "[link me up](http://www.example.com)"
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>})
我做错了什么?
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
[链接](http://example.com "提示信息")
的工具提示,可以使用此正则表达式:/\[([^\]]+)\]\(([^)"]+)(?: \"([^\"]+)\")?\)/
。 - nfvshttp://example.com?query[]=something
这样的 URL 应该是允许的,但提供的正则表达式没有考虑到这一点。 - thatidiotguy