2012-02-13 90 views
15

我想寫一個正則表達式來替換一個markdown樣式的鏈接,但它似乎並沒有工作。這是我到目前爲止:如何使用正則表達式轉換Markdown風格的鏈接?

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

我在做什麼錯了?

+0

爲什麼不使用一個完整的Ruby降價庫,就像精彩[kramdown](HTTP ://kramdown.rubyforge.org/)? – Phrogz 2012-02-13 22:41:01

+0

,因爲我只需要一個有限的Markdown功能子集,並沒有找到一個允許我指定要支持哪些功能的庫(所以我不得不自己寫)。 – Andrew 2012-02-14 00:00:42

回答

36
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 
+0

很好的解釋。謝謝! – Andrew 2012-02-14 00:03:17

+1

也,我從來沒有看到括號的網址。我甚至不認爲這是有效的。謝謝指出, – Andrew 2012-02-14 00:07:17

+0

真棒解釋。如果可能的話,會給出超過+1。我最終使用你的建議爲[[foobar]]類型的語法做了一個匹配器。這裏是我的(從你的簡化):/ \\ [\\ [([^ \\]] +)\\] \\] /。 – 2012-03-18 18:20:44

相關問題