【问题标题】:Replace double quotes inside double quotes html attribute替换双引号html属性内的双引号
【发布时间】:2016-02-29 15:42:43
【问题描述】:

在某些情况下,我的客户向我发送了一个 html 字符串,其中包含一些结构不正确的元素属性。像这样:

<img src="../imgTest.jpg" alt="Something "quoted here, or here"">

接下来我如何动态地将这些情况更改为类似的情况?

<img src="../imgTest.jpg" alt="Something 'quoted here, or here'">

我需要这个 html 不是在浏览器上显示,而是用它做一些操作。

我正在使用 HtmlAgilityPack 来控制 html 问题,但对于这些情况,它会将我的 html 字符串更改为此,这不是我想要的:

<img src="../imgTest.jpg" alt="Something" quoted="" here,="" or="" here="">

我的 HtmlAgilityPack 代码:

var htmlDoc = new HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.LoadHtml(myHtmlStr);

var htmlError = htmlDoc.ParseErrors.SafeAny();

if (!htmlError)
    myHtmlStr = htmlDoc.DocumentNode.InnerHtml;

【问题讨论】:

标签: c# html regex replace html-agility-pack


【解决方案1】:

我的想法是匹配",如果它在标签内并且不是属性限定符。

免责声明:此解决方案可能无法在 100% 的情况下工作(如果元素/属性名称中添加了命名空间,则需要进行调整),但当标签名称紧跟 &lt; 时,它应该可以工作,双引号是用作属性值限定符,属性内没有&lt;符号。

使用

(?<=<\w+\b[^<]*)(?<!\w+=)"(?!\s*/?>|\s+\w+=")

并替换为'

请参阅regex demo

第一个lookbehind确保我们在标签中搜索双引号,如果在双引号之前有一个后跟等号的单词,则第二个将失败匹配,如果双引号,则否定的lookahead匹配失败引号后跟空格,后跟右尖括号(可能前面是正斜杠),或者当有空格后跟一个单词后跟等号时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多