C#正则表达式替换url

时间:2010-05-31 18:05:48

标签: c# regex

我在文档中有一堆链接,必须用javascript调用替换。所有链接看起来都一样:

<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>

因此,url中的Id = 3D是函数中的第一个参数,doc参数是函数调用中的第二个参数。

我想使用Regex这样做,因为我认为这是最快捷的方式。但问题是我的正则表达式知识太有限了

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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>

答案 2 :(得分: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文件。