繁体   English   中英

正则表达式仅替换HTML标记中的引号

[英]Regular expression to replace quotation marks in HTML tags only

我有以下字符串:

<div id="mydiv">This is a "div" with quotation marks</div>

我想使用正则表达式返回以下内容:

<div id='mydiv'>This is a "div" with quotation marks</div>

请注意div中的id属性现在如何被撇号包围?

我怎么能用正则表达式做到这一点?

编辑:我不是在寻找一个魔术子弹来处理每种情况下的每一个边缘情况。 我们都应该厌倦使用正则表达式解析HTML,但在这种特殊情况下,对于我的特殊需要,正则表达式是解决方案......我只需要一些帮助来获得正确的表达式。

编辑#2: Jens为我找到了一个解决方案,但任何随机访问此页面的人都应该考虑使用此解决方案。 在我的情况下,它的工作原理是因为我对我将要处理的字符串类型非常有信心。 我知道危险和风险,并确保你这样做。 如果你不确定你是否知道它可能表明你不知道也不应该使用这种方法。 你被警告过了。

这可以通过以下方式进行:我认为你要替换的每一个实例" ,这是之间的<>'

所以,你在你的文件中查找每个"在后面查找< ,然后查找> 。正则表达式如下所示:

(?<=\<[^<>]*)"(?=[^><]*\>)

您可以根据自己的喜好替换找到的字符,也许使用Regex.Replace

注意:虽然我发现Stack Overflow社区最友好和最有帮助,但在我看来,这些正则表达式/ HTML问题的回答有点过于愤怒。 毕竟,这里的问题不会问“什么正则表达式匹配所有有效的HTML,并且与其他任何内容都不匹配。”

你可以匹配:

(<div.*?id=)"(.*?)"(.*?>)

并将其替换为:

$1'$2'$3

我看到你知道使用正则表达式进行这些替换的危险。 我已经为那些寻找一种更稳定的方法的人添加了以下答案,如果你想要一个能够随着输入文档的变化而继续工作的解决方案。

使用HTML Agility Pack( 项目页面nuget ),这可以解决问题:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM