正则表达式仅适用于标签

Regex which works only in tag

本文关键字:标签 适用于 正则表达式      更新时间:2023-09-26

使用 JavaScript,我尝试将任何属性与以"on"开头的值匹配(可能是 onerroronmouseover 等),我的例子是:

/<*?(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. 仅获取属性名称和值(匹配排除 = 和 "):

/<{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. 获取带值的属性(匹配项包括 = 和 "):

/<{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. 获取整个标记:

/(<{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. 获得以上所有内容:

/(<{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 代码的"不推荐"方式。