2010-05-31 110 views
2

我在文檔中有一堆鏈接,必須由javascript調用替換。所有的鏈接看起來是一樣的:C#正則表達式替換url

<a href="http://domain/ViewDocument.aspx?id=3D1&doc=form" target="_blank">Document naam 1</a> 
<a href="http://domain/ViewDocument.aspx?id=3D2&doc=form" target="_blank">Document naam 2</a> 
<a href="http://domain/ViewDocument.aspx?id=3D3&doc=form" target="_blank">Document naam 3</a> 

現在,我想這一切鏈接被替換到:

<a href="javascript:loadDocument('1','form')">Document naam 1</a> 
<a href="javascript:loadDocument('2','form')">Document naam 2</a> 
<a href="javascript:loadDocument('3','form')">Document naam 3</a> 

所以說ID = 3D在URL中的功能和文檔的第一個參數參數是函數調用中的第二個參數。

我想這樣做使用正則表達式因爲我認爲這是最快的方式。但問題是我的正則表達式的知識太有限

+0

本帖標題和內容讓我困惑。你想讓你的javascript函數包含Regex,或者你想調用一個具有Regex函數的C#webmethod嗎? – 2010-05-31 18:14:56

+0

我想調用一個C#方法來替換JavaScript鏈接的鏈接。 – Martijn 2010-05-31 18:25:57

回答

1

Polygenelubricants指出我在非常正確的方式,但已刪除his answer :(

他給了我this link感謝。他發現我的解決方案:

string replaced = ""; 

string regex = "<a href=3D\"http://\\S+id=3D(\\d+)&doc=3D(\\w+)\" target=3D\"_parent\">"; 
Regex regEx = new Regex(regex); 

replaced = regEx.Replace(mhtFile, "<a href=3D\"javascript:window.parent.loadDocument('$1','$2')\">"); 

Response.Write(replaced); 

對於那些有興趣的人來說,這個鏈接在.mht文件中。這就是3D放在=符號後的原因。變量mhtFile包含純mht文本中的整個mht文件。

+0

@polygenelubricants:如果您正在閱讀本文,您可能希望取消刪除您的答案,以便Martijn可以對其進行修改和/或接受。 – 2010-06-01 09:00:18

+0

@Mark感謝您尋找正確的用戶 – Martijn 2010-06-01 11:38:49

5
Regex regex = new Regex(@"http://domain/ViewDocument.aspx\?id=3D(\d+)&doc=(\w+)"); 
Match match = regex.Match(link.Href); 
if (match.Success) 
{ 
    link.Href = string.Format("javascript:loadDocument('{0}','{1}')", match.Groups[1].Value, match.Groups[2].Value); 
} 
+0

@Mark Oops,已修復。 – Anton 2010-05-31 18:16:22

+1

Thnx,但我沒有完全理解它。鏈接.Href是我的文檔(字符串格式),它包含我所有的鏈接?當有多個鏈接時,我不需要循環或什麼東西? – Martijn 2010-05-31 18:19:50

+0

將代碼包裝在'foreach'循環中。 link是你的迭代器變量。如果沒有鏈接作爲可枚舉集合,則對文檔字符串本身運行'regex.Match'並遍歷匹配。 – Anton 2010-05-31 23:26:39

2

你可以使用Html Agility Pack幫助解析HTML。這裏是你如何能做到這一點:

//Regex regex = new Regex(@"^http://domain/ViewDocument\.aspx\?id=3D(\d+)&amp;doc=(\w+)$"); 
Regex regex = new Regex(@"^http://domain/ViewDocument\.aspx\?id=3D(\d+)&doc=(\w+)$"); 
HtmlDocument doc = new HtmlDocument(); 
doc.Load("input.html"); 
var nodes = doc.DocumentNode 
       .Descendants("a") 
       .Where(node => regex.IsMatch(node.Attributes["href"].Value)); 

foreach (HtmlNode node in nodes) 
{ 
    var href = node.Attributes["href"]; 
    href.Value = regex.Replace(href.Value, "javascript:loadDocument('$1','$2')"); 
    node.Attributes["target"].Remove(); 
} 

doc.Save(Console.Out); 

結果:

 
<a href="javascript:loadDocument('1','form')">Document naam 1</a> 
<a href="javascript:loadDocument('2','form')">Document naam 2</a> 
<a href="javascript:loadDocument('3','form')">Document naam 3</a> 
+0

+1,哇,這看起來很棒。我應該學習C#。 – polygenelubricants 2010-05-31 18:34:00