我在文档中有一堆链接,必须用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这样做,因为我认为这是最快捷的方式。但问题是我的正则表达式知识太有限了
答案 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+)&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文件。