2013-05-08 52 views
1

我有一個要求,在服務器端的HTML文檔(例如href或src屬性)中爲所有相對或相對服務器URL預先設置一個URL段,應用程序爲相對於服務器的相對/相對URL預先設置一個URL段

我正在.NET環境中工作,不幸的是,沒有好的基類庫用於將HTML字符串加載到DOM中並對其進行操作(我也沒有能夠引入第三方庫),所以這似乎是一個正則表達式替換的好候選,但這是我有點弱

我需要一個正則表達式,可以處理這兩種情況:

相對於服務器的URL:

href="/controller/action" -> href="/MyPathSegment/controller/action"

相對URL:

href="image/logo.gif" -> href="/MyPathSegments/image/logo.gif"

不要擔心什麼MyPathSegment是..我有邏輯的其他地方,可以計算出水平路徑段的相對URL,我只想專注於正則表達式問題

我想我需要一個reg可以匹配任何src="..."href="/..."模式,並在第一次打開雙引號後插入我的字符串,但對於正則表達式沒有足夠的經驗來解決這個問題。

+0

這對於/ in是什麼?例如,Apache的模塊可以在運行中重寫URL。 – 2013-05-08 15:48:34

+0

這是一個標準的.NET ASP.NET應用程序託管在IIS上,在我無法控制的環境中,唉 – blue18hutthutt 2013-05-08 17:45:14

回答

2

你想要找到一個URL,聲明URL當前不包含/ MyPathSegment /,並用相同的屬性(href或src)和相同的URL結尾替換它,但在中間,把你的路徑段:

(?<tag>(?:href|src)=")(?(?=/MyPathSegment/)(?!)|/?(?<url>[^"]*")) 

替換爲:

${tag}/MyPathSegment/${url} 

在VB.Net:

Dim strPathPrefix As String = "/MyPathSegment/" 
Dim strTest As String = Regex.Replace("<a href=""/controller/action"" property=""something"">Hello World</a>", "(?<tag>(?:href|src)="")(?(?=" & strPathPrefix & ")(?!))/?(?<url>[^""]*"")", "${tag}/MyPathSegment/${url}") 

strTest = <a href="/MyPathSegment/controller/action" property="something">Hello World</a> 

注在VB中,我不得不加倍報價。

有了這個用法,無論你是否有一個斜槓目前是無關緊要的。你只需要確保你的strPathPrepend以「/」結尾

在一些事情上測試它,讓我知道如果你碰到任何可能需要調整的顛簸。

RegexBuddy Example

(?<tag>... 

下面這個數據應該被捕獲到一個名爲「標籤」捕獲組。

(?:href|src) 

匹配「href」或「src」。 「?:」表示不必然捕獲結果到該特定子表達式,雖然結果將捕捉到父子表達的‘標籤’

=") 

捕獲等號和報價符號字面上,並關閉捕獲組。對於「標籤」

(?(...)...|...) 

實施例的條件語句中的IF是在小的子表達式中,THEN是交替的左側「|」,在ELSE是在交替的右側。

(?=...) 

示例Lookaround。在這種情況下,查找結果是「預測」。這意味着:檢查當前位置之後的文本是否等於某些內容,但不要超前光標。

(?(?=/MyPathSegment/)... 

所以,把我們的兩個例子在一起,我們得到了一個有條件它說...如果,收集HREF =後」,我們發現/ MyPathSegment /,然後...

(?!) 

這是另一種Lookaround,它是一個負向前瞻,但它沒有任何內容,通常它會是(?!...),因爲它是一個負向前瞻,它是空的,它會自動失敗正則表達式。如果它看到您的路徑段已經存在,則失敗。

|/? 

否則,if/MyPathSegment /未找到...可以選擇查找斜槓,但它不在捕獲組中。

(?<url>... 

而且else語句...可選的斜線後,建立我們的第二個捕獲組命名爲「URL」

[^"]*" 

捕捉任何不報價...多次(可選,如果你想要求某些東西,則將*更改爲+),然後捕捉所有不是引用的內容...並將引用捕獲到「url」捕獲組中。

)) 

首先關閉網址捕獲組,然後關閉條件組。

+0

如果我在PowerShell中用「 blue18hutthutt 2013-05-08 17:59:13

+0

我想斷言需要檢查,如果URL不以http://或https://開頭,因爲那將暗示它是絕對路徑URL,而相對於服務器URL的相對/相對只能以字母開頭(作爲URL段的一部分)或/? – blue18hutthutt 2013-05-08 18:10:57

+0

我不相信PowerShell允許cond它的正則表達式引擎。如果不是這樣,可能是別的。它在VB/C#.Net中工作。 – Suamere 2013-05-08 19:02:53