正则表达式只适用于标记

时间:2015-01-20 13:29:40

标签: javascript regex

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

/<*?(on[^=-\s]+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?/gmi

(在线示例:https://www.regex101.com/r/dQ4xH4/1

但我想只在标签中使用这种常规表达方式(在&#39;&#39;&#39;&#39;&#39;字符之间)正如您在当前示例中看到的那样,正则表达式匹配甚至在标签之外。如何修改仅在标签(任何标签)中数学的正则表达式?

3 个答案:

答案 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. 仅设置属性名称和值(匹配exclude =和&#34;):
  2. /<{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. 带有值的geting属性(匹配include =和&#34;):
    2. /<{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. 确定整个标记:
      2. /(<{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. 上述所有内容:
        2. /(<{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代码的方法。