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