Firefox中Javascript正则flag U失效,如何提取div的id后缀数字?
问题原因
U修饰符报错原因
U修饰符是PCRE正则体系下的「非贪婪模式全局修饰符」,JavaScript原生正则语法不支持该标识,因此Firefox浏览器会直接抛出语法错误。
移除U后匹配范围过大的原因
你编写的捕获规则[^()]*含义为「匹配所有不包含左右括号的字符」,在原始无括号的HTML字符串中,该规则会从第一个img-开始一直向后匹配,直到命中整个字符串最后一处" class才会停止,因此会出现整段选中的问题。你手动添加括号后,[^()]*遇到括号就会终止匹配,刚好符合你之前加U修饰符的非贪婪效果,因此可以正常运行。
解决方案
不需要额外修改原HTML字符串,直接使用更精准的正则规则即可,你要提取的是img-后到id属性结束双引号之间的数字,直接针对数字匹配即可:
正确正则:/img-(\d+)"/g
JS调用示例:
// 原始HTML字符串 const rawHtml = `<div id="img-1" class="draggable">AP2<br><img src="URL"></div><div id="img-3" class="draggable">AP6<br><img src="URL"></div><div id="img-6" class="draggable">AP5<br><img src="URL"></div>`; const idReg = /img-(\d+)"/g; const result = []; let matchItem; // 循环匹配所有符合规则的内容 while ((matchItem = idReg.exec(rawHtml)) !== null) { // 捕获组第一个内容就是目标数字 result.push(matchItem[1]); } console.log(result); // 输出 ["1", "3", "6"]
如果id中img-后可能存在非数字内容,也可以使用匹配到最近双引号的规则:/img-([^"]+)"/g,调用逻辑和上述代码完全一致,也能得到正确结果。
内容的提问来源于stack exchange,提问作者Wolden
相关产品推荐
相关产品推荐

