2009-09-14 48 views
-1

所有,.NET正則表達式:更換鏈接和IMG SRC

我需要編寫一個正則表達式來執行以下操作 取代

(A)

src ="/folder/image.jpg" 

src="http://www.mydomain.com/folder/image.jpg" 

src="/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/folder/image.jpg" 

(B)

href="/folder/file.zip" 

href="http://www.mydomain.com/folder/file.zip" 

href="/cache/getCaccheItem.aspx?source_url=http://www.mydomain.com/folder/file.zip 

我知道我可以使用

(src|href).*?=['|\"](?<url>.*?)['|\"] 

$1="/legacy_integration/cache/getCacheItem.aspx?source_url=$2" 

一個替代值趕SRC = ...和HREF = ...屬性。不過,我需要根據文件擴展名來過濾 - 只匹配,如:JPG,PNG,GIF圖像有效擴展,並只匹配像拉鍊和pdf HREF擴展。

有什麼建議嗎?該問題可以概括爲:修改上述表達式以僅匹配某些文件擴展名,並且僅當原始URL爲相對時才允許插入域http://www.mydomain.com/,從而確保輸出文本僅包含一次域。

我需要執行此使用兩個不同的正則表達式,一個用於源文本,包括域名,一個沒有?或者,我可以採用某種使用條件匹配的語句,與替換式組合,將插入基於匹配的文本是否包含域的域或沒有?

我知道我可以使用自定義匹配評估器來執行此操作,但似乎在正則表達式本身內執行此操作可能會更快/更高效。

建議/評論?

+0

[RegEx match open tags but XHTML self-contained tags]可能的重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – AeroX

回答

1

請問下面的表達式的工作?

Regex.Replace(url, 
@"(src|href)\s*=\s*(?:'|")((?:http://www\.mydomain\.com)?.*?(jpg|bmp|png))(?:'|")", 
"$1 - /cache/getCacheItem.aspx?source_url=$2"); 

的想法是,你的文字http://www.mydomain.com匹配條件。它將作爲$ 2匹配文本的一部分包含在內。如果它最初在那裏,它將進入被替換的字符串。

0

這個模式將匹配任何路徑,如果你想約束一個路徑,你可以在?/之後添加它。

(?<pre>(?:src|href)\W*=\W*(?:"|'))(?<url>(?:http://www\.mydomain\.com)?/(?<file>[^"']+))(?<post>"|') 

下面是一些示例代碼:

string pattern = "(?<pre>(?:src|href)\\W*=\\W*(?:\"|'))(?<url>(?:http://www\\.mydomain\\.com)?/(?<file>[^\"']+))(?<post>\"|')"; 

string test = "src =\"/folder/image.jpg\"\r\n" 
      + "src=\"http://www.mydomain.com/folder/image.jpg\"\r\n" 
      + "href=\"/folder/file.zip\"\r\n" 
      + "href=\"http://www.mydomain.com/folder/file.zip\""; 

string replacement = "${pre}/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/${file}${post}"; 

test = Regex.Replace(test, pattern, replacement); 
0

這個是什麼?

var reg = new Regex("(/folder/[^\"]+)"); 
Match m = reg.Match("src=\"http://www.mydomain.com/folder/image.jpg\""); 
var result = string.Format("src=\"/cache/getCacheItem.aspx? source_url=http://www.mydomain.com{0}\"", m.Groups[1].Value); 
+0

@Espen P:看起來像這樣會導致始終包含http://www.mydomain.com的網址。從我從OP收集的信息中,David只希望該域包含在原始URL中。 –

+0

我可能並不清楚 - 我希望該域名包括它是否是原始URL的一部分。 –

2

此出現所有的時間。正則表達式不是解析非正則語法(如HTML)的適當工具。使用一個真正的解析器(如HTML agility pack)來做到這一點。

+0

我不需要解析所有的HTML,只是指定的標籤。我也可以控制輸入數據,並可以保證輸入的文本與給定的格式匹配。似乎在這裏涉及另一個第三方工具的矯枉過正。 –

+0

這不是過分的,它的可靠性,如果你解析所有解析任何東西,並不重要。試試吧,它會幫助解決許多問題,而不僅僅是這一個。 – annakata

+0

儘管我非常欣賞完全穩定的方法,但這個特定的解決方案是a)工作的,b)臨時解決方案,它允許我在新的ASP.NET框架中呈現大量傳統ASP內容,以及c)工作。正如我所說的,我可以控制輸入數據,並可以保證我的正則表達式正常工作。如果將來我需要更通用的解決方案,我會很樂意探索敏捷包。謝謝。 =) –

相關問題