You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求可稳定移除JavaScript on开头事件代码的正则表达式方案

解决移除所有以on开头的JavaScript事件属性的问题

你的问题出在原正则的贪婪匹配逻辑上——它会把从onxxx=开始到字符串末尾的所有内容一股脑吃掉,而不是精准匹配单个事件属性。我们可以针对HTML属性的不同写法,设计一个更精准的正则表达式来解决这个问题。

原正则的问题分析

/\son\w+=.+/ 里的 .+ 是贪婪匹配,它会尽可能多地匹配字符直到字符串结束。比如如果你的字符串是 autofocus onfocus=test class=demo,原正则会把 onfocus=test class=demo 全部移除,而不是只移除 onfocus=test 这个目标属性。另外它也没考虑到事件属性值的多种写法:带单引号、双引号、不带引号的情况都没覆盖到。

改进后的正则表达式

试试这段PHP代码:

$subject = preg_replace('/\s+on\w+=(?:"[^"]*"|\'[^\']*\'|[^\s>]+)/i', '', $subject);

正则各部分拆解说明

  • \s+:匹配一个或多个空白字符,确保我们匹配的是独立的属性(避免和其他内容连在一起误匹配)
  • on\w+:匹配以on开头的事件名(比如onfocus、onload),\w+能覆盖所有合法的事件名后缀
  • =:匹配属性的等号
  • (?:"[^"]*"|\'[^\']*\'|[^\s>]+):分支匹配三种常见的属性值写法:
    • "[^"]*":匹配双引号包裹的属性值(比如onclick="alert('hello')")
    • \'[^\']*\':匹配单引号包裹的属性值(比如onload='init()')
    • [^\s>]+:匹配不带引号的属性值(直到遇到空格或HTML标签结束符>为止)
  • /i:不区分大小写,兼容OnFocus这类大小写混合的写法

测试你的示例

原字符串:autofocus оnfocus=(alert)(/OPENBUGBOUNTY/)/ /
处理后结果:autofocus,完全符合你的需求。

额外注意事项

  • 如果属性值里有转义的引号(比如onclick="alert(\"test\")"),这个正则无法处理,但这种场景在普通HTML中比较少见;
  • 这个正则会逐个移除所有on开头的事件属性,不管字符串里有多少个;
  • 如果你的字符串包含完整的HTML标签(比如<div onload=xxx class=test></div>),它也能正确只移除onload=xxx属性。

内容的提问来源于stack exchange,提问作者Efim Bistrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:58