正则表达式,用于查找所有DOM事件侦听器

时间:2014-03-18 16:14:24

标签: regex security wysihtml5

我实际上是想让wysihtml5编辑器的结果安全 基本上,用户无法输入script / forms / etc标签。

我无法删除所有标签,因为其中一些标签用于显示所希望的内容 (例如:<h1>显示标题)

问题是用户仍然可以添加绑定到某些不需要的代码的DOM事件侦听器 (例如:<h1 onclick="alert('Houston, got a problem');"></h1>

我想删除div中的所有事件侦听器(对于该div中的所有后代) 我实际尝试使用的解决方案是将代码检查为字符串,以查找和替换不需要的内容,这些内容适用于不需要的标记。

我真正需要的是一个匹配所有标签内所有事件监听器的正则表达式 像&#34;选择&lt;之间的所有[on *]和&gt;&#34; 例子:
<h1 onclick=""></h1> =&gt;应该匹配 <h1 onnewevent=""></h1> =&gt;应该匹配 <h1>onclick=""</h1> =&gt;应该匹配

先谢谢你的帮助;)

1 个答案:

答案 0 :(得分:1)

不应该使用正则表达式解析html 如果你真的想要,这是一种快速而肮脏的方式 (绝不完整)。

它只是寻找打开'onevent'标签及其后面的结束标签 如果中间还有其他内容,只需在代码之间添加.*?即可。

 #  <([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*></\1\s*>
 # /<([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*><\/\1\s*>/

 < 
 ( [^<>\s]+ )                    # (1), 'Tag'
 \s 
 [^<>]* on [^<>="]+ = [^<>]*     # On... = event
 >
 </ \1 \s* >                     # Backref to 'Tag'

Perl测试用例

$/ = undef;

$str = <DATA>;

while ( $str =~ /<([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*><\/\1\s*>/g )
{
    print "'$&'\n";
}


__DATA__
(eg : <h1 onclick="alert('Houston, got a problem');"></h1>) 

I would like to remove all event listeners inside a div
(for all descendants inside that div).
The solution I actually tried to use is to check the code as
a string to find and replace unwanted content,
which worked for the unwanted tags. 

What I actually need is a regex matching all event
listeners inside all tags.
Something like "select all [on*] between < and >".
Examples :
<h1 onclick=""></h1> => Should match
<h1 onnewevent=""></h1> => Should match
<h1>onclick=""</h1> => Should NOT match 

输出&gt;&gt;

'<h1 onclick="alert('Houston, got a problem');"></h1>'
'<h1 onclick=""></h1>'
'<h1 onnewevent=""></h1>'