用于查找和删除事件属性的正则表达式。onclick、onload、onhover 等

Cha*_*had 1 php regex

我已经断断续续地这样做了几天,但我对 RexEx 的掌握程度并不好。是的,我知道 RegEx 不是用于解析 HTML 的。我正在对 CKEditor 输入进行服务器端“清理”,它已经做到了这一点,但仅限于客户端。

剥离所有白名单标签后...

第一:删除所有用引号$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html); 正确引用的事件属性'"

第二:$html = preg_replace(' on\w+=\S+', '', $html);*删除那些没有引号但仍然可以触发的,例如。onclick=blowUpTheBase()

我想做的是确保 onEvent 位于<&之间>,但只有当 onEvent 属性是标签后的第一个属性时,我才能让它工作。我尝试的一切最终都会捕获大部分代码。我就是懒得够。

前任。$html = preg_replace('<([\s\S]?)( on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);

编辑:我将选择 @colburton 的答案,因为 RegEx 是我所要求的。我也会将它用于我的特殊情况,因为它会带来技巧。(无论如何,这是一个内部应用程序)

我要感谢@Casimir et Hippolyte 的回答因为它提供了一个很好的例子并解释了如何以“正确的方式”做到这一点。我将很快使用 DOMDocument 编写一个函数,它将成为我处理 RTE/WYSIWYG/HTML 输入的首选方式。

col*_*ton 5

也许我应该从一开始就提到这一点:这不是你应该尝试过滤 XSS 的方式。这在您建议的参数内纯粹是学术性的(例如“使用正则表达式”)。


这让你非常接近:

preg_replace('/(<.+?)(?<=\s)on[a-z]+\s*=\s*(?:([\'"])(?!\2).+?\2|(?:\S+?\(.*?\)(?=[\s>])))(.*?>)/ig', "$1 $3", $string);
Run Code Online (Sandbox Code Playgroud)

测试于

<a href="something" onclick="bad()">text</a> onclick not in tags
<a href="something" onclick=bad()>text</a>
<a href="something" onclick="bad()" >text</a>
<meta name="keywords" content="keyword1, keyword2, keyword3">

<a href="something" onclick= "bad()">text</a> onclick not in tags
<a href="something" onclick =bad()>text</a>
<a href="something" onclick=bad('test')>text</a>
<a href="something" onclick=bad("test")>text</a>
<a href="something" onclick="bad()" >text</a>
What if I write john+onelia=love forever?
Run Code Online (Sandbox Code Playgroud)

在这里玩一下: https: //regex101.com/r/GMBaQs/9