如何用正则捕获第三方XML中的未闭合CDATA标签?
问题背景
从第三方获取的XML存在CDATA标签未闭合的格式错误,需要编写正则表达式仅捕获这类错误的CDATA。当前使用的正则在未闭合CDATA的场景中有效,但当CDATA内容包含HTML标签时会出现假阳性误判。
当前使用的正则
((<{1}[a-zA-Z-_]*>{1}){1}(<!\[CDATA\[){1}((?!]]>).)*((</){1}[a-zA-Z-_]*>{1}){1})
测试用例
未闭合CDATA的错误场景
<Couleur_regroupement> <![CDATA[Rose;Jaune </Couleur_regroupement> <Dessus_Tige> <![CDATA[26]]> </Dessus_Tige>
含HTML内容的正常CDATA场景(不应被误判)
<Desart> <![CDATA[Title<br><img src=img.jpg> blabla <i>bla</i> blabla<br><img src=img.jpg></br> ]]> </Desart>
修正后的正则表达式
<([a-zA-Z-_]+)>\s*<!\[CDATA\[(?:(?!]]>).)*?<\/\1>
正则逻辑说明
<([a-zA-Z-_]+)>:匹配XML起始标签,同时捕获标签名到分组1,确保后续配对的结束标签一致\s*:匹配起始标签与CDATA开头之间的任意空白字符(含换行),适配格式不规整的XML<!\[CDATA\[:精准匹配CDATA的起始标记(?:(?!]]>).)*?:非捕获分组,用非贪婪模式匹配任意字符,但严格排除]]>,确保只匹配未闭合的CDATA内容<\/\1>:匹配与起始标签同名的结束标签,精准定位“CDATA未闭合就直接结束父标签”的错误场景
效果验证
- 错误场景:会精准捕获
<Couleur_regroupement>标签内未闭合的CDATA内容,不会误判下方正常的CDATA - 正常场景:CDATA内的HTML标签不会触发父标签的结束匹配,且CDATA有正确的
]]>闭合,因此不会被误捕获
内容的提问来源于stack exchange,提问作者Xbattlax
相关产品推荐
相关产品推荐

