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、foreaches 或多少个括号,我也不知道它的顺序。这个例子只是一个例子。

我怎样才能得到函数的代码?先感谢您。

4

2 回答 2

2

免责声明

正如其他用户所说,这可能不是一个好方法。如果你还是决定使用它,请仔细检查你的结果,因为这regex可能是危险的。

丑陋的解决方案

即使该功能是最后一个(@Nippey),您也可以匹配一些东西:

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

Note:我正在使用(?:xyz)which 用于非捕获括号组。检查您的正则表达式引擎是否支持它。

输出

    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 回答