使用修饰符/ e

时间:2018-09-19 21:12:24

标签: php migration php-5.6 php-7.1

所以我有为php 5.6编写的php函数。我认为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>$1</b>',
            '<i>$1</i>',
            '<u>$1</u>',
            '<s>$1</s>',
            '<img src="$1">',
            '<font style="color:$1;">$2</font>',
            'GenerateQuote($1)',
            '<a style="color:#ff6600" href=https://' . $_SERVER['SERVER_NAME'] .'/(...)/$1>$1</a>'
    );

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

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

该函数用于将文本中的BB标签转换为相应的HTML标签。 quote标记使用的/ e参数在PHP 7中不再受支持。

  

preg_replace():/ e修饰符不再受支持,请改用preg_replace_callback

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

1 个答案:

答案 0 :(得分:1)

大多数表达式不包含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'] .'/(...)/$1>$1</a>',
  $tmp);

应该这样做,但是如果您仅在该位置使用GenerateQuote,则可以重写该函数以接受数组并将其直接用作回调。