我想寫一個正則表達式來替換一個markdown樣式的鏈接,但它似乎並沒有工作。這是我到目前爲止:如何使用正則表達式轉換Markdown風格的鏈接?
# ruby code:
text = "[link me up](http://www.example.com)"
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>})
我在做什麼錯了?
我想寫一個正則表達式來替換一個markdown樣式的鏈接,但它似乎並沒有工作。這是我到目前爲止:如何使用正則表達式轉換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的正則表達式電子x
傾向於選擇讓它看起來不像貓跳上鍵盤上:
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
爲什麼不使用一個完整的Ruby降價庫,就像精彩[kramdown](HTTP ://kramdown.rubyforge.org/)? – Phrogz 2012-02-13 22:41:01
,因爲我只需要一個有限的Markdown功能子集,並沒有找到一個允許我指定要支持哪些功能的庫(所以我不得不自己寫)。 – Andrew 2012-02-14 00:00:42