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

时间:2010-03-15 14:48:50

标签: c# asp.net regex html-agility-pack

我有以下字符串:

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

3 个答案:

答案 0 :(得分:2)

这可以通过以下方式完成:我认为您要替换"的每个实例,即<>之间'

因此,您在文件中查找每个",查看<后面的内容,然后查看>。正则表达式看起来像:

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

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

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

答案 1 :(得分:0)

你可以匹配:

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

并将其替换为:

$1'$2'$3

答案 2 :(得分:0)

我发现您已经意识到使用Regex进行这些替换的危险。如果您想要一个能够随着输入文档的变化而继续工作的解决方案,那么我为那些寻找更加“稳定”的方法的人添加了以下答案。

使用HTML Agility Pack(project pagenuget),可以解决这个问题:

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 */);