用REGEX替换HTML文本中的每个双引号

时间:2015-02-13 12:00:41

标签: html asp.net regex

我正在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 &quot;wonderful long text&quot;. &quot;Another wonderful ong text&quot;</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中的替换问题?

3 个答案:

答案 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("\"", "&quot;");
}
StringWriter sw = new StringWriter();
doc.Save(sw);
string result = sw.ToString();

我已经使用您的示例HTML对其进行了测试,这是(期望的)结果:

<p>This is a &quot;wonderful long text&quot;. &quot;Another wonderful ong text&quot;</p> At least it should be. Here we have a <a href="http://wwww.site-to-nowhere.com" target="_blank">link</a>

答案 1 :(得分:0)

你可以

  1. 替换标签内的引​​号
  2. 到处替换剩余的报价
  3. 实施例

    Regex rx = new Regex("<.*?>");
    string result = rx.Replace(text, 
                           new MatchEvaluator(ReplaceLink)).Replace("\"", "&quot;");
    
    ...
    static string ReplaceLink(Match m)
    {
        return m.ToString().Replace("\"", "'");
    }
    

    演示:https://dotnetfiddle.net/5qkXaE

答案 2 :(得分:0)

我会这样做

Find: "(?=[^<]*>)
Replace: '

Find: "(?=[^>]*<)
Replace: &quot;

虽然,是否有必要使用第一个正则表达式?第二个应该做的工作正常,并留下双引号标签属性。正如斯米莫夫所说,一旦你的报价的一面被替换,你可以只做其余的一般替换。我只提供两个正则表达式,因为你可能会发现第一个甚至没必要。

此外,正如Ridgerunner的评论所指出的那样

  

可靠地完成任务并非易事。例如,您需要处理以下标记:<p title="Can't put this in single quotes!">..</p>。 (注意双引号属性值中的单引号。)

这是一个非常有效的观点。如果你在这里不需要单引号,我坦率地不会使用它们。

在很多情况下,您不想使用正则表达式来解析html,但这是一个非常简单的情况,我认为在这里使用正则表达式并没有错。这与#34;在括号之外寻找逗号&#34;没有什么不同,它会看到过多的答案。

但是,确实,正则表达式中更复杂的html模式匹配是一项非常困难/几乎不可能完成的任务,这是18- $ max(myage,50)手动毛发拔除秃头的主要原因。