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 に答える