我想用正则表达式解析 PHP 代码,以找到我们代码库中声明的所有顶级函数。
简单的:
^\s*function\s*([\w_-]+)\(
工作得很好,但抓住了额外的
class Foo {
function bar() {...}
}
关于如何跳过没有范围的非顶级函数的任何想法?
注意:我知道,我知道,我应该使用真正的解析器,但我想要一些快速而肮脏的东西,可以在grep -R -P
非常大的代码库中运行。
如果您愿意使用 ruby(或基本上任何带有命名捕获组的东西),您可以使用如下内容:
^\s*(?<type>\w+)\s*(?<name>[\w_-]+)(?<function>\([^()]*\))?\s*(?<body>{((?>[^{}]+)|(\g<body>))*})
那些是函数的将在function
捕获组中有括号。那些是类不会。
http://rubular.com/r/3dXZts6OYF
虽然非常脆。
在缩进良好的代码库上,
^function\s*([\w_-]+)\(
应该只捕获顶级函数。如果您期望前导空格,您可以对 a 使用零宽度的负后视{
,以避免在类声明的开头使用函数:
(?<!{)\s*function\s*([\w_-]+)\(
首先,我不得不说,这类东西很大程度上取决于你的代码有多么严格。对于我自己,我会在行首立即启动所有顶级函数。因此,如果我想找到非顶级函数(在 vim 中),我只需
/^[[:space:]]\+function[[:space:]]\+\w\+\>
和
/^function[[:space:]]\+\w\+\>
对于所有顶级功能。
但是,正如我所说,这取决于您的代码库的格式。祝你好运!