我正在ASP.NET中编写一个Web应用程序。我需要正则表达式的帮助。我需要两个表达式,第一个可以帮助我获取并最终用单引号替换HTML标记中的每个双引号字符,第二个表达式可以获取并替换不是HTML标记的一部分的每个双引号"
。
例如:
<p>This is a "wonderful long text". "Another wonderful ong text"</p> At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>
应该这样改变。
<p>This is a "wonderful long text". "Another wonderful ong text"</p> At least it should be. Here we have a <a href='http://wwww.site-to-nowhere.com' target='_blank'>link</a>
我尝试过以下表达式:
"([^<>]*?)"(?=[^>]+?<)
但问题是它无法捕获"Another wonderful ong text"
可能是因为它位于</p>
标记的旁边。
你能帮我解决这个问题吗?或者是否有任何其他解决方案来解决.NET中的替换问题?
答案 0 :(得分:2)
Don't use regex to parse HTML。我可以推荐HtmlAgilityPack
:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); // html is your HTML-string
var textNodes = doc.DocumentNode.SelectNodes("//text()");
foreach (HtmlAgilityPack.HtmlTextNode node in textNodes)
{
node.Text = node.Text.Replace("\"", """);
}
StringWriter sw = new StringWriter();
doc.Save(sw);
string result = sw.ToString();
我已经使用您的示例HTML对其进行了测试,这是(期望的)结果:
<p>This is a "wonderful long text". "Another wonderful ong text"</p> At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>
答案 1 :(得分:0)
你可以
实施例
Regex rx = new Regex("<.*?>");
string result = rx.Replace(text,
new MatchEvaluator(ReplaceLink)).Replace("\"", """);
...
static string ReplaceLink(Match m)
{
return m.ToString().Replace("\"", "'");
}
答案 2 :(得分:0)
我会这样做
Find: "(?=[^<]*>)
Replace: '
Find: "(?=[^>]*<)
Replace: "
虽然,是否有必要使用第一个正则表达式?第二个应该做的工作正常,并留下双引号标签属性。正如斯米莫夫所说,一旦你的报价的一面被替换,你可以只做其余的一般替换。我只提供两个正则表达式,因为你可能会发现第一个甚至没必要。
此外,正如Ridgerunner的评论所指出的那样
可靠地完成任务并非易事。例如,您需要处理以下标记:
<p title="Can't put this in single quotes!">..</p>
。 (注意双引号属性值中的单引号。)
这是一个非常有效的观点。如果你在这里不需要单引号,我坦率地不会使用它们。
在很多情况下,您不想使用正则表达式来解析html,但这是一个非常简单的情况,我认为在这里使用正则表达式并没有错。这与#34;在括号之外寻找逗号&#34;没有什么不同,它会看到过多的答案。
但是,确实,正则表达式中更复杂的html模式匹配是一项非常困难/几乎不可能完成的任务,这是18- $ max(myage,50)手动毛发拔除秃头的主要原因。