我遇到一些情况,我的客户向我发送了一个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字符串更改为this并且它不是我想要的:
<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;
答案 0 :(得分:1)
我的想法是匹配"
,如果它在标记内并且不是属性限定符。
免责声明:此解决方案可能无法在100%的情况下工作(如果在元素/属性名称中添加了名称空间,则需要进行调整),但是当标记名称立即跟随<
时,它应该有效引号用作属性值限定符,属性中没有<
个符号。
使用
(?<=<\w+\b[^<]*)(?<!\w+=)"(?!\s*/?>|\s+\w+=")
并替换为'
。
请参阅regex demo。
第一个lookbehind确保我们在标签内搜索双引号,如果在双引号之前有一个跟随等号的单词,则第二个看不到匹配,如果双引号则负向前瞻失败引用之后是空格,后面是一个结束尖括号(可能以正斜杠开头),或者当有空格后面跟着一个带有等号的单词。