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

vuktfyat  于 2023-06-07  发布在  其他
关注(0)|答案(4)|浏览(439)

我正在用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中的这个替换问题?

vmjh9lq9

vmjh9lq91#

不要使用正则表达式来解析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>
busg9geu

busg9geu2#

我会这么做

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

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

但是,有必要使用第一个正则表达式吗?第二个应该能很好地完成工作,而不去管双引号标记属性。正如smimov所说,一旦你的报价的一面被替换,你可以只做一个通用的替换其余的。我只提供了两个正则表达式,因为您可能会发现第一个甚至不必要。
此外,正如Ridgerunner的评论所指出的
不是一个琐碎的任务,以可靠地做。例如,您需要处理如下标记:<p title="Can't put this in single quotes!">..</p>。(注意双引号属性值中的单引号。)
这是一个非常有效的观点。如果你在这里不需要单引号,坦白地说,我不会使用它们。
有很多例子你不想使用正则表达式来解析html,但这是一个非常非常简单的例子,我认为在这里使用正则表达式没有什么错。这与“在括号外寻找逗号”没有什么不同,后者会看到过多的答案。
但是,是的,确实,在regex中进行更复杂的html模式匹配是一项非常困难/几乎不可能完成的任务,这也是导致18-$max(myage,50)手动拔毛脱发的主要原因。

mum43rcc

mum43rcc3#

你可以的
1.替换标记内的引号
1.替换所有剩余的引号
示例

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

6xfqseft

6xfqseft4#

虽然这不再相关,但这个选项在所问的问题上是可能的(例如,在PHP> 5.2的实现中):
HTML代码示例。

$cHTML = '<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>';

    // Let's transform it as you wanted.
    $cHTML = str_replace( '"','&quote;', 
                          preg_replace_callback('/[^\s][=].*?"(.*?)"/ui',
                                   function ($matches) {
                                     return str_replace( '"'.$matches[1].'"',
                                                         "'".$matches[1]."'", 
                                                             $matches[0]);
                                   }, $cHTML) 
                        );

    // Let's show the result.
    var_dump( $cHTML );

您将收到您的“奇怪”HTML代码:

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

相关问题