【问题标题】:Regex to match all top-level functions正则表达式匹配所有顶级函数
【发布时间】:2012-11-07 07:01:01
【问题描述】:

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

简单的:

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

效果很好,但有多余的东西

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

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

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

【问题讨论】:

  • 我认为grep 无法做到这一点,它只是孤立地查看每一行,并且无法判断前一行是类声明。您可以在 awk、perl 或 php 中编写一些东西来查找类声明,然后通过计算匹配的大括号跳到类的末尾,尽管如果您不是非常小心,它可能会被 cmets 或字符串中不匹配的大括号弄糊涂。为什么不使用带有工具的 IDE 来进行这种分析?
  • grep -P 做多行
  • 好的,但是使用正则表达式检测匹配的大括号内是否有东西真的很困难。
  • Regexen 可能不是这项工作的正确工具,但看看我的尝试。

标签: php regex parsing


【解决方案1】:

在缩进良好的代码库上,

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

应该只捕获顶级函数。如果您希望有前导空格,您可以使用 zero-width negative look-behind 代替 {,以避免在类声明的开头使用函数:

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

【讨论】:

  • 这是一个好的开始。有没有办法为类中的第二个函数做到这一点?
【解决方案2】:

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

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

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

适用于所有顶级函数。

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

【讨论】:

  • 不,我的代码库很大,有时顶级函数会缩进,有时类函数根本不会缩进。
【解决方案3】:

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

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

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

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

虽然非常脆弱。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多