2013-02-18 102 views
1

我正在使用C#爲這個項目,基本上我需要的是一種將純文本轉換爲HTML的方式,我找到了一個正則表達式(實際上是Stack Overflow),用於將文本中的鏈接轉換爲在HTML錨鏈接,它看起來像這樣:正則表達式與URL提取

 Regex regx = new Regex(@"https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?", RegexOptions.IgnoreCase); 

     MatchCollection mactches = regx.Matches(input); 
     foreach (Match match in mactches) 
     { 
      output = output.Replace(match.Value, String.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", match.Value)); 
     } 

它的偉大工程,但我發現,它並沒有考慮破折號一個缺陷( - )作爲URL的一部分,所以當它擊中第一破折號關閉錨標記。 所以我很明顯需要在正則表達式中包含破折號,但問題是我完全不知道RegEx的情況,它對我來說看起來像俄語。 有沒有人有一個想法,我需要對RegEx表達做些什麼小小的修改,以便在URL中包含一個破折號作爲允許的字符?

+0

你可以舉一個它不匹配的URL的例子嗎?我的測試表明它的確如此。 – 2013-02-18 05:18:27

+0

另外,你有'matches'拼寫錯誤:p – 2013-02-18 05:24:53

回答

2

試試這個:@"https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?"

我添加了一個衝向第二個字符類(方括號中的部分)中,是不是域名的URL部分匹配破折號。

+0

+1。就如此容易。我沒有意識到OP有目錄問題。 – 2013-02-18 05:23:42

+0

優秀!非常感謝,修復它。 問題在於「漂亮」SEO鏈接中帶有破折號的網址,例如:http://www.yourdomain.com/this-pretty-link-didnt-work-before-now-it-does – Thomas 2013-02-18 06:58:33

0

我用這一個支撐ftpfile方案以及http

@"\b((https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;\(\)]*[A-Z0-9+&@#/%=~_|$]" 

將認識到,包含由&分隔的參數,這樣的網址:

http://www.cbsnews.com/video/watch/?id=7400904n&tag=re1.channel

原文位於Extract URLs from a text (Regex)。我修改了它稍微認識到,包含這樣的括號中的URL:

http://msdn.microsoft.com/en-us/library/ms686722(v=VS.85).aspx

您需要與此正則表達式指定RegexOptions.IgnoreCase但當然,你可以用\w更換A-Z簡化。