2014-01-23 99 views
0

我試圖取代普通域名就像「A」的標籤的輸入字符串的子串,使用正則表達式是這樣的:正則表達式替換domain子在C#中的HTML標籤

var pattern = @"[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})"; 

var input = "text1 www.example.com text2 <a href='foo'>www.example.com</a> text3"; 

var result = Regex.Replace(input, pattern, string.Format("<a href='$0'>$0</a>")); 

這將創建以下的輸出:

text1 <a href='www.example.com'>www.example.com</a> text2 <a href='foo'><a href='www.example.com'>www.example.com</a></a> text3 

哪一個是錯誤的,因爲第二個域已經是標記,現在是標記內的標記。

有沒有辦法修改正則表達式模式來忽略第二域子字符串的匹配?

也許通過忽略在域substring開始的'>'字符? (或結尾 '<' 炭)

有效地產生這樣的結果:

text1 <a href='www.example.com'>www.example.com</a> text2 <a href='foo'>www.example.com</a> text3 
+1

如何使用HTML解析器作業? HTML並不適合被正則表達式混淆。 HtmlAgilityPack很好。 – spender

+1

公平地說,這還不是真的HTML。但http://stackoverflow.com/a/1732454/1336590仍然是必讀的。 「 www.example.com'應該發生什麼事情(注意空格)?這足以說明一場比賽之前不能直接使用'>'或直接使用''後面的''? – Corak

+0

什麼是動態的,你的輸入是什麼? –

回答

2

嘗試這種情況:

(?i)(?<!>)((w{3}\.)[^.]+\.[a-z]+(\.?[a-z])*) 

這假設每個域開始以www。您可以隨意使用您的替換,除非域前面有>。這可能不是你正在尋找的東西,而是它開始的某個地方,研究負面看法,因爲我相信這會對你有所幫助。

+0

我想你的正則表達式中有一個丟失的字符'「z」' –

+0

如果沒有www。假設呢? (example.com) – dzolnjan

+0

認爲這可能是一個問題,但就像我說它開始的地方,任何改進超過歡迎:-)是的@ThiagoVinicius,「Z」本來是一個「\」 – Srb1313711

0

什麼你也可以嘗試如下:

var pattern = @"(.*?)\s([\w*]+(\.{1}\w*)+)"; 

var result = Regex.Replace(input, pattern, string.Format("$1 <a href='$2'>$2</a>"), RegexOptions.None); 

它會得到所有域沒有「www」的爲好。