如何用PHP正则提取JS中4字符名称的独立内部函数
问题:正则匹配JS内部函数时结果合并的解决方法
待处理的JavaScript源码
<script>function outerfunction () { function abcd () { return ('efgh', 1); } function efgh () { return ('higk', 2); } }</script>
问题现状
使用PHP的preg_match_all(),正则模式/(function.[a-z]{4}.[(][)].*)}/s提取名称为4个小写字母的内部函数时,结果将两个函数合并到同一个数组元素中:
array[1] => function abcd () { return ('efgh', 1); } function efgh () { return ('higk', 2); }
期望结果
每个函数作为独立的数组元素:
array[1] => function abcd () { return ('efgh', 1); } array[2] => function efgh () { return ('higk', 2); }
解决方案
问题根源是原正则使用了贪婪匹配(*),会从第一个function开始匹配到最后一个}。只需调整为非贪婪匹配,并修正正则中的冗余匹配:
修改后的正则
/(function [a-z]{4}\(\).*?})/s
关键调整点
- 将原正则中的
.替换为空格,精准匹配函数名前的空格(避免匹配到无关字符) - 把贪婪匹配的
*改为非贪婪匹配的*?,确保匹配到当前函数的闭合}就停止 - 保留
s修饰符,让.能匹配换行符(兼容多行函数体场景)
PHP代码示例
$jsCode = '<script>function outerfunction () { function abcd () { return (\'efgh\', 1); } function efgh () { return (\'higk\', 2); } }</script>'; preg_match_all('/(function [a-z]{4}\(\).*?})/s', $jsCode, $matches); print_r($matches[1]);
输出结果
Array ( [0] => function abcd () { return ('efgh', 1); } [1] => function efgh () { return ('higk', 2); } )
补充说明
如果目标函数体存在嵌套的{},上述简单正则可能失效。这种情况下建议使用专业的JavaScript解析器(如PHP的V8JS扩展)来处理,而非正则表达式。但针对当前场景,非贪婪匹配足以解决问题。
内容的提问来源于stack exchange,提问作者Amit Shah
相关产品推荐
相关产品推荐

