2011-03-23 25 views
0

我試圖用正則表達式來匹配和替換錨標籤。我到目前爲止是這樣的:正則表達式將匹配錨與#在href中的#

"(<a href=['\"]?([\\w_\\.]*)['\"]?)" 

這種方法的問題是,它無法捕獲也有#值的hrefs。我試過

"(<a href=['\"]?([\\w_\\.#]*)['\"]?)" 

"(<a href=['\"]?([\\w_\\.\\#]*)['\"]?)" 

沒有成功。

我在做什麼錯了?

謝謝

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Martijn 2011-03-23 09:39:05

回答

3

我不認爲這個問題是#(正常工作對我來說),但缺少其他網址字符,如-/:

怎麼樣的正則表達式像這樣:

<a href=("[^"]+"|'[^']+'|[^ >]+) 

注:如果可能的話,使用有效的HTML解析其他DOM方法。

+0

謝謝。我想使用一個html解析器,而不是正則表達式,但是這是針對客戶端的silverlight應用程序,所以我不能訪問這些程序集。我想我會開發一個Web服務,爲我遠程執行解析,以訪問完整的.NET平臺(並使用DOM解析器)。 – scripni 2011-03-23 11:43:32

1
<a href=(('|")[^\2]+?\2|[^>]+) 
+0

如果URL包含在''''''中,這將不會很好。或者,如果URL沒有用引號括起來(不正確的xhtml,但似乎OP正在嘗試匹配這樣的鏈接)。 – Czechnology 2011-03-23 10:34:24

+0

感謝您的警告..我做了必要的更正.. – 2011-03-23 11:00:17

+0

您也應該在否定列表中有一個空格(對於沒有引號和更多屬性的情況)。這個正則表達式的問題是,如果url包含另一個引號或'>'(非轉義),它會過早結束。這就是爲什麼我使用那個看起來醜陋的列表式正則表達式。 – Czechnology 2011-03-23 11:17:38

1

如果您只是想替換錨部分使用字符串操作。它們更簡單更快

var parts = "http://someurl.com#hashpart".Split("#"); 
// yields "http://someurl.com" and "hashpart" as array. 
// you may want to check if the result has length of two 
// if it does : 
var newUrl = string.Format("{0}#{1}" parts[0], "some replacement for hashpart"); 

如果您的URL包含多個散列,請嘗試使用string.Substring在第一個hashtag處進行分割。

var url = "http://someurl.com#hash#hashhash"; 
var hashPos = url.IndexOf("#"); 
var urlPart = url.Substring(hashPos); 
var hashPart = url.Substring(hashPos +1, url.length - hashPos -1); 

應該工作,沒有驗證地寫下來,也許你必須折騰一些+/- 1才能找到正確的位置。