0

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

简单的:

^\s*function\s*([\w_-]+)\(

工作得很好,但抓住了额外的

class Foo {
  function bar() {...}
}

关于如何跳过没有范围的非顶级函数的任何想法?

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

4

3 回答 3

0

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

^\s*(?<type>\w+)\s*(?<name>[\w_-]+)(?<function>\([^()]*\))?\s*(?<body>{((?>[^{}]+)|(\g<body>))*})

那些是函数的将在function捕获组中有括号。那些是类不会。

http://rubular.com/r/3dXZts6OYF

虽然非常脆。

于 2012-11-07T08:07:44.540 回答
0

在缩进良好的代码库上,

^function\s*([\w_-]+)\(

应该只捕获顶级函数。如果您期望前导空格,您可以对 a 使用零宽度的负后视{,以避免在类声明的开头使用函数:

(?<!{)\s*function\s*([\w_-]+)\(
于 2012-11-07T07:06:57.330 回答
0

首先,我不得不说,这类东西很大程度上取决于你的代码有多么严格。对于我自己,我会在行首立即启动所有顶级函数。因此,如果我想找到非顶级函数(在 vim 中),我只需

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

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

对于所有顶级功能。

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

于 2012-11-07T07:07:28.857 回答