Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式匹配所有顶级函数_Php_Regex_Parsing - Fatal编程技术网

Php 正则表达式匹配所有顶级函数

Php 正则表达式匹配所有顶级函数,php,regex,parsing,Php,Regex,Parsing,我想用正则表达式解析PHP代码,以查找代码库中声明的所有顶级函数 最简单的是: ^\s*function\s*([\w_-]+)\( 效果很好,但有多余的 class Foo { function bar() {...} } 关于如何跳过没有作用域的非顶级函数,有什么想法吗 注意:我知道,我知道,我应该使用一个真正的解析器,但我想要一些快速而肮脏的东西,可以在非常大的代码库上运行grep-R-p。在缩进良好的代码库上 ^function\s*([\w_-]+)\( 应该只捕获顶级函数。

我想用正则表达式解析PHP代码,以查找代码库中声明的所有顶级函数

最简单的是:

^\s*function\s*([\w_-]+)\(
效果很好,但有多余的

class Foo {
  function bar() {...}
}
关于如何跳过没有作用域的非顶级函数,有什么想法吗


注意:我知道,我知道,我应该使用一个真正的解析器,但我想要一些快速而肮脏的东西,可以在非常大的代码库上运行
grep-R-p

在缩进良好的代码库上

^function\s*([\w_-]+)\(
应该只捕获顶级函数。如果需要前导空格,可以将a用于
{
,以避免在类声明的开头使用函数:

(?<!{)\s*function\s*([\w_-]+)\(

(?首先,我必须说,这类事情在很大程度上取决于代码的规范性。对于我自己,我会在行的开头立即启动所有顶级函数。因此,如果我想找到非顶级函数(在vim中),我只需这样做

/^[[:space:]]\+function[[:space:]]\+\w\+\>

对于所有顶级功能


但是,正如我所说的,这取决于您的代码库的格式。祝您好运!

如果您愿意使用ruby(或者基本上是使用命名捕获组的任何东西),您可以使用以下内容:

^\s*(?<type>\w+)\s*(?<name>[\w_-]+)(?<function>\([^()]*\))?\s*(?<body>{((?>[^{}]+)|(\g<body>))*})
^\s*(?\w+)\s*(?[\w-]+)(?\([^()]*\))?\s*(?(((?>[^{}]+)|(\g))*})
属于函数的将在
函数
捕获组中有括号。属于类的将不会


但是非常脆弱。

不,我的代码库很大,有时顶级函数缩进,有时类函数根本不缩进。我不认为这可以通过
grep来实现,它只是孤立地查看每一行,不能判断前面的某一行是类声明。你可以用aw编写一些东西k、 perl或php,它查找类声明,然后通过计算匹配的大括号跳到类的末尾,但如果您不非常小心,它可能会被注释或字符串中不匹配的大括号弄糊涂。为什么不使用IDE和工具来进行这种分析呢?
grep-P
进行多重链接,但检测whet她说,在匹配的大括号内使用regex非常困难。Regexen可能不是完成这项工作的合适工具,但看看我的尝试。这是一个好的开始。对于类中的第二个函数,有什么方法可以做到这一点吗?
^\s*(?<type>\w+)\s*(?<name>[\w_-]+)(?<function>\([^()]*\))?\s*(?<body>{((?>[^{}]+)|(\g<body>))*})