2

PHP ファイルを編集して、関数のコードを提供されている別のコードに置き換えています。私の問題は、関数のコードが変更される可能性があることです。したがって、それを見つけるために正規表現をどのように行うべきか正確にはわかりません。

次に例を示します。

function lol()
{
    echo('omg');
    $num=0;
    while($num<100)
    {
        echo('ok');
    }
}
function teste()
{
    echo('ola');
    while($num<100)
    {
        echo('ok');
    }
}
function test()
{
    echo('oi');
    while($num<100)
    {
        echo('ok');
    }
}

必要なのは、関数 teste() のコードを取得することです。これは次のようになります。

echo('ola');
while($num<100)
{
    echo('ok');
}

しかし、関数内にwhile、foreach、またはブラケットがいくつあるかわかりません。また、順序もわかりません。例は単なる例でした。

関数のコードを取得するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

2

免責事項

他のユーザーが述べたように、これはおそらく良いアプローチではありません。とにかくそれを使用することにした場合は、危険な可能性があるため、結果を再確認してください.regex

醜い解決策

関数が最後の関数であっても、一致させることができます(@Nippey):

(?:function teste\(\))[^{]*{(.*?)}[^}]*?(?:function|\Z) 

Note:私が使用し(?:xyz)ているのは、非キャプチャ括弧グループ用です。正規表現エンジンがサポートしているかどうかを確認してください。

出力

    echo('ola');
    while($num<100)
    {
        echo('ok');
    }
于 2013-06-25T08:27:43.780 に答える
1

再帰パターン(?R)を使用すると、ネストされたブラケットを一致させることができます:

$result = preg_replace_callback('#(.*?)\{((?:[^{}]|(?R))*)\}|.*#si', function($m){
    if(isset($m[1], $m[2]) && preg_match('#function\s+teste\b#i', $m[1])){
        return $m[2];
    }
}, $code); // Anonymous function is used here which means PHP 5.3 is required

echo $result;

オンラインデモ

于 2013-06-25T09:08:17.963 に答える