正则表达式仅适用于标签
Regex which works only in tag
使用 JavaScript,我尝试将任何属性与以"on"开头的值匹配(可能是 onerror、onmouseover 等),我的例子是:
/<*?(on[^=-'s]+)=["']?((?:.(?!["']?'s+(?:'S+)=|[>"']))+.)["']?/gmi
(在线示例:https://www.regex101.com/r/dQ4xH4/1)
但是我想仅在标签(在"<"和">"字符之间)中使用这个常规表达式,因此,正如您在当前示例中所看到的,正则表达式甚至在标签之外也匹配。如何修改我的正则表达式,它仅在标签(任何标签)中数学运算?
假设你已经构建了一个你尝试处理的 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
开头。
对[^>]
进行非贪婪匹配,以确保您仍在 HTML 元素中。
<[^>]*?(on[^=-'s]+)=["']?((?:.(?!["']?'s+(?:'S+)=|[>"']))+.)["']?
您可以根据实际需求尝试几种不同的解决方案:让我们以这个标签为例: <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)'
使用多个测试进行演示
- 获取带值的属性(匹配项包括 = 和 "):
/<{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)'
使用多个测试进行演示
- 获取整个标记:
/(<{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)'
使用多个测试进行演示
- 获得以上所有内容:
/(<{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)'
使用多个测试进行演示
编辑:这是我对这个答案的最终编辑。我不会继续扩展它,因为正则表达式是一种解析 HTML 代码的"不推荐"方式。
- JQueryhide()不适用于Mozzilla,但适用于Chrome
- PHP中的setcookie仅适用于localhost
- html5 drawImage适用于firefox,而不是chrome
- 提供“;onClick"适用于iPad(触摸屏)和桌面用户的默认功能
- jQuery表单验证适用于Mozilla和Internet Explorer,但不适用于Chrome或Safari
- ResolveUrl是否适用于././也
- Firebase updateChildValues适用于IOS,但不适用于Web和Android
- JavaScript警报适用于int,但不适用于string
- SQLite插件适用于Mac和Windows,但不适用于手机上的Safari
- Regex Replace仅适用于Last Match
- window.onload适用于aspx页面,但不适用于普通html
- Jquery Ajax POST不工作.适用于GET
- 画布上的自定义字体仅适用于safari
- Javascript仅适用于alert()和Debug模式
- JS适用于Firefox和Safari,但不适用于Chrome.此处'是我的网站
- Regex不适用于Firefox,但适用于Chrome
- HTML5视频标签没有't适用于iPad
- Javascript代码关闭标签,适用于IE, Firefox和Chrome
- 从标签返回文本,其中最外层的HTML标签适用于jquery中的所有文本节点
- Onclick只适用于img标签