使用修饰符 /e 将 preg_replace 函数从 php 5 迁移到 php 7

Migrating preg_replace function from php 5 to php 7 using modifier /e

所以我有 php 为 php 5.6 编写的函数。我认为 this 最初是我放在一起时的来源。我做了一些改变。这是我最终得到的代码:

function Format($input){

    //escape input

    $search = array(
            '/\[b\](.*?)\[\/b]/is',
            '/\[i\](.*?)\[\/i]/is',
            '/\[u\](.*?)\[\/u]/is',
            '/\[s\](.*?)\[\/s]/is',
            '/\[img\](.*?)\[\/img\]/is',
            '/\[color=(.*?)\](.*?)\[\/color\]/is',
            '/\[quote=(.*?)\]/e',
            '/\[p\](.*?)\[\/p]/is',
   );
    $replace = array(
            '<b></b>',
            '<i></i>',
            '<u></u>',
            '<s></s>',
            '<img src="">',
            '<font style="color:;"></font>',
            'GenerateQuote()',
            '<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>'
    );

    return preg_replace($search, $replace, $input);
}

function GenerateQuote($commentID){
    $sqlresult = mysqli_query($db, "(...)");
    (...)
    return $QuoteCode;
}

该函数用于将一段文字中的BB标签转换为对应的HTML标签。 quote 标签使用了一个在 PHP 7.

中不再支持的 /e 参数

preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

有人可以帮助我将这段代码从 PHP 5.6 迁移到 PHP 7 吗?我不知道该怎么做。

您的大部分表达式不包含 e 修饰符,因此它们可以保持原样。但是你需要拆分数组,并分别处理 eval 表达式。

删除 searchreplace 的最后两行。那么:

$tmp = preg_replace($search, $replace, $input);

应用前六个替换项。然后用preg_replace_callback去掉e修饰符:

$tmp = preg_replace_callback('/\[quote=(.*?)\]/', 
  function ($m) { return GenerateQuote($m[1]); },
  $tmp);

最后一部分又是一个简单的替换(从你的问题中复制粘贴)。

return preg_replace('/\[p\](.*?)\[\/p]/is',
  '<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/></a>',
  $tmp);

应该可以,但是如果您只在那个地方使用 GenerateQuote,您可以重写函数以接受一个数组并将其直接用作回调。