替换HTML属性中的双引号

3

我有一些客户向我发送带有不正确结构的元素属性的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;

1
很抱歉,我害怕没有正则表达式的解决方案看起来既好又安全。尝试使用 (?<=<\w+\s[^<]*)(?<!\w+=)"(?!\s*/?>|\s+\w+=")&i=%3cimg+src%3d%22..%2fimgTest.jpg%22+alt%3d%22Something+%22quoted+here%2c+or+here%22%22%3e&r=%27'进行替换。 - Wiktor Stribiżew
1
你的HTML片段是否总是像你示例中的img一样只有一个元素?它总是相同的属性出了问题吗? - Alex K.
1
你可以尝试类似这样的正则表达式 (=\s*"[^=">]*)"([^=">]*)"([^=">]*"),并用 $1'$2'$3 进行替换,但这种方法并不是非常可靠 :> - bobble bubble
@WiktorStribiżew 非常感谢,这非常有效! - Ninita
@AlexK。不,它并不总是像img一样是单个元素,并且它的属性也不总是相同的。 - Ninita
显示剩余2条评论
1个回答

1
我的想法是,如果引号在标签内且不是属性限定符,则进行匹配"
免责声明:这种解决方案可能无法在所有情况下使用(如果元素/属性名称添加了命名空间,则需要进行调整),但它应该适用于紧随<之后的标记名称,使用双引号作为属性值限定符,并且没有<符号在属性中。
使用
(?<=<\w+\b[^<]*)(?<!\w+=)"(?!\s*/?>|\s+\w+=")

并将其替换为'

请参见正则表达式演示

第一个lookbehind确保我们正在搜索标签内的双引号,第二个会在双引号之前有带等号的单词时导致匹配失败,负向前瞻会在双引号后面有空格加上闭合尖括号(可能是前面有斜杠)或者紧跟着等号的单词时导致匹配失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接