2011-12-25 15 views
2

私はphpファイル内のすべての関数ブロック(最初から最後まで)に一致する正規表現を探しています。例:ファイル内のphp関数を見つけるためのpython正規表現

function test_function($var) { 
if ($var == 'somethin') { 
print 'hi'; 
} 
etc. 
} 

ブロックの開始オフセットと終了オフセットが必要です。どのような正規表現を使用できますか?

+5

正規表現はまったく適していません。あなたは単純なパーサーでもっとうまくいくでしょう。 –

答えて

1

これは非常に複雑で、1つの正規表現では実行できません。

あなたは簡単に `このような関数の先頭を一致させることができると思うかもしれ:

\bfunction\b\s+\S+[^\(](\s+)?\(.*?\)\s+\{ 

しかし、あなたはできない、これはコードに何があるされている場合ので?

$string = "function myfunction() {}"; 

引用されていないものをすべて検索する必要があります。あなたは機能が停止したときに知っておく必要があると私は任意の正規表現について考えることができないので、あなたが何をすべき次の事はすべて{}をカウントしている

(?:(?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)(?:\\.|[^\\'"]))+ 

:だから、引用符で囲まれた文字列を除外するために、あなたは、この正規表現を使用することができますそれはこれを行うことができます。ですから、これをループスルーする必要があります。

+0

'(?R'でカウントすることもできます(おそらく、Pythonではそうでないかもしれません)。いくつかのサブルーチンは引用を単純化します。任意のPHPの場合、コメントなども注意する必要があります。 (近似はしばしばより良いオプションです) – mario

+0

@micha、それは何か*引用符で囲まれた文字列を除く*正規表現は正確に行われるはずですか?そしてPHP文字列では正しく動作しないようです有効な文字列として '' foo "bar''を扱います – Qtax

+0

引用符で囲まれた文字列を除くすべてを選択します[http://gskinner.com/RegExr/?2vcr2] – noob

1

これを見てください:https://github.com/ramen/phply

+0

興味深い、それは現在doesn 'いくつかの引用構文をサポートしています。 – Qtax

+0

誰かがその通りに行ったことはとても涼しいです。 "産業言語、*疣贅、すべてを解析することについてもっと学びます。" – mario

関連する問題