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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:27