使用JavaScript我尝试将任何属性与值匹配,该值以" on"开头。 (它可能是 onerror , onmouseover 等),我的例子:
/<*?(on[^=-\s]+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?/gmi
(在线示例:https://www.regex101.com/r/dQ4xH4/1)
但我想只在标签中使用这种常规表达方式(在&#39;&#39;&#39;&#39;&#39;字符之间)正如您在当前示例中看到的那样,正则表达式匹配甚至在标签之外。如何修改仅在标签(任何标签)中数学的正则表达式?
答案 0 :(得分:3)
假设您已经构建了一个您正在尝试处理的HTML的DOM:
var nodes = root.getElementsByTagName('*');
var result = [].filter.call(nodes, function(el) {
return [].some.call(el.attributes, function(attr) {
return attr.name.match(/^on/i);
});
});
迭代root
下找到的所有元素,并检查任何属性名称是否以on
开头。
答案 1 :(得分:-1)
为[^>]
执行非贪婪的匹配,以确保您仍在HTML元素中。
<[^>]*?(on[^=-\s]+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
答案 2 :(得分:-1)
您可以尝试多种不同的解决方案,具体取决于您的实际需求:
让我们以此标记为例:<source onerror="alert(1)">
/<{1}\w+[\w\s\'\"\=]*(on[^=-\s]+)=["']([\S\w\d]*|[\S\w\d ]*)["']>{1}/gmi
这将返回如下所示的数组:
array (size=2)
0 => string 'onerror'
1 => string 'alert(1)'
Demo多次测试
/<{1}\w+[\w\s\'\"\=]*((on[^=-\s]+)=["']([\S\w\d]*|[\S\w\d ]*)["'])>{1}/gmi
这将返回如下所示的数组:
array (size=3)
0 => string 'onerror="alert(1)"'
1 => string 'onerror'
2 => string 'alert(1)'
Demo多次测试
/(<{1}\w+[\w\s\'\"\=]*(on[^=-\s]+)=["']([\S\w\d]*|[\S\w\d ]*)["']>{1})/gmi
这将返回如下所示的数组:
array (size=3)
0 => string '<source onerror="alert(1)">'
1 => string 'onerror'
2 => string 'alert(1)'
Demo多次测试
/(<{1}\w+[\w\s\'\"\=]*((on[^=-\s]+)=["']([\S\w\d]*|[\S\w\d ]*)["'])>{1})/gmi
这将返回如下所示的数组:
array (size=4)
0 => string '<source onerror="alert(1)">'
1 => string 'onerror="alert(1)"'
2 => string 'onerror'
3 => string 'alert(1)'
Demo多次测试
编辑:这是我对这个答案的最终修改。我不会继续扩展它,因为RegEx是一个&#34;不推荐&#34;解析HTML代码的方法。