0

重複の可能性:
コード ファイルから php 関数を抽出するための PHP 正規表現

次のような形式の関数のリストを含むファイルがあります。

function foo(){
      ...code { code{}  } code...
}

この特定のファイルでは、常に「関数」という単語を一番左に配置し、終わりの中括弧を一番左に配置します。通常どおり、関数内のコードは常にインデントされます。関数内のコードには、中かっこを含む任意の文字を含めることができます。

PHPでファイルを解析して、関数の名前がキーである関数の連想配列を取得したいと思います。私はこれを始めたばかりです。これは非常に簡単なスタートです。

$regex = "/function.*/";
preg_match_all($regex, $str, $result, PREG_PATTERN_ORDER);
$arr = $result[0];

print_r($arr);

これにより、次が生成され、新しい行ごとに停止します。

Array
(
    [0] => function foo(){
    [1] => function bar(){
    [2] => function stop(){
    [3] => function go(){
)

正規表現を次のように変更してみました:

$regex = "/function.*\n}$/s";

私の考えでは、改行文字の直後に終了中括弧\n}$が続く場合、関数の最後に一致すると考えていました。ただし、これは機能しません。その後のすべてを含む 1 つの長い要素を持つ配列が生成されます。function foo()

連想配列のキーに関数名を入れ始めていません。

4

2 に答える 2

2

@ジョンR

これは正規表現ソリューションです:

$regex = '~
  function                 #function keyword
  \s+                      #any number of whitespaces 
  (?P<function_name>.*?)   #function name itself
  \s*                      #optional white spaces
  (?P<parameters>\(.*?\))  #function parameters
  \s*                      #optional white spaces
  (?P<body>\{.*?\})        #body of a function
~six';

if (preg_match_all($regex, $input, $matches)) {
  print_r($matches);
}
于 2012-06-10T20:35:49.400 に答える
0

あなたの場合は、次のような式で十分です。

/^function\s++(\w++).*?^}/ms

}インデントされていない最初の一致で停止します。関数名は最初のキャプチャ グループに含まれ、一致全体が関数になります。

于 2012-06-10T19:59:40.673 に答える