我有一个文件,其中的函数列表格式如下:
function foo(){
...code { code{} } code...
}
对于这个特定的文件,我总是将单词'function'一直放到左边,将结束的花括号一直放到左边。按照惯例,函数中的代码将始终缩进。函数中的代码可能包含任何字符,包括花括号。
我想用PHP解析文件,以获得一个关联函数数组,其中函数的名称是键。我刚开始这个,这是一个非常简单的开始:
$regex = "/function.*/";
preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER);
$arr = $result[0];
print_r($arr);
这会生成以下内容并在每个新行停止:
Array
(
[0] => function foo(){
[1] => function bar(){
[2] => function stop(){
[3] => function go(){
)
我尝试将正则表达式更改为:
$regex = "/function.*\n}$/s";
我的想法是,如果有一个直线花括号的新行字符,\n}$
将匹配函数的结尾。但是,这不起作用,它会生成一个包含一个长元素的数组,该元素包含function foo()
我还没有开始将函数名称放入关联数组的键中。
答案 0 :(得分:1)
@John R
这是正则表达式解决方案:
$regex = '~
function #function keyword
\s+ #any number of whitespaces
(?P<function_name>.*?) #function name itself
\s* #optional white spaces
(?P<parameters>\(.*?\)) #function parameters
\s* #optional white spaces
(?P<body>\{.*?\}) #body of a function
~six';
if (preg_match_all($regex, $input, $matches)) {
print_r($matches);
}
答案 1 :(得分:0)
在你的情况下,这样的表达式就足够了:
/^function\s++(\w++).*?^}/ms
它会在第一个没有缩进的}
处停止匹配。函数名称将在第一个捕获组中,整个匹配是函数。