需要在JS代码中找到该方法的使用方法addEventListener。
结构:объект.addEventListener(' событие', обработчик, другие_параметры_при_наличии)
处理程序可以是先前声明的函数(名称),也可以是带有声明(function)的函数本身。
我有以下正则表达式
import re
from pprint import pprint
REX_ADD_EVENT_LISTENER = re.compile(
r'\s*([A-Za-z0-9_]+).addEventListener\s*\('
r'\s*[\'"`]([a-z]+)[\'"`]\s*,'
r'\s*([A-Za-z0-9_]+|function\s*\(([^)]*)\)\s*{\s*(.+?)})\s*'
r',?\s*(.+)?\);?'
)
js_code = '''\
ctr_switch.addEventListener('mousedown', onMouseDown, false);
ctr_switch.addEventListener('mouseup', onMouseUp, false);
ctr_switch.addEventListener('mouseout', function() {
if (flag) {
setSignal("status", false);
flag = false;
}
}, false);'''
pprint(REX_ADD_EVENT_LISTENER.findall(js_code))
# [('ctr_switch', 'mousedown', 'onMouseDown', '', '', 'false'),
# ('ctr_switch', 'mouseup', 'onMouseUp', '', '', 'false'),
# ('ctr_switch', 'mouseout', 'function', '', '', '(')]
如果处理程序是一个函数名,一切正常(尽管结果中有额外的空行),但拉出一个定义的函数function是不可能的(你还需要这个函数的主体)。
请告诉我如何修改正则表达式。
不需要搜索箭头函数。
我使用以下正则表达式得到一个简单的函数:
import re
from pprint import pprint
REX_FUNCTION = re.compile(
r'(?ms)function\s+([A-Za-z0-9_]+)\s*\([^)]*\)\s*{\s(.+?)^}')
js_code = '''\
function onMouseDown() {
setSignal("status", true);
flag = true;
}
ctr_switch.addEventListener('mousedown', onMouseDown, false);'''
pprint(REX_FUNCTION.findall(js_code))
# название функции тело
# [('onMouseDown', ' setSignal("status", true);\n flag = true;\n')]
可以从 addEventListener 获得大致相同的函数结果(当然,没有名称)。
所以在这里(主要问题是它
.没有在函数体中找到换行符(替换[\s\S]或添加s标志),但我也简化了一点):测试https://regex101.com/r/vwlt8s/3
生成的代码:
结果中出现“空行”,因为示例中的函数没有参数,所以第 4 组为空。