用preg_replace_callback替换/ e修饰符

时间:2014-01-25 23:49:05

标签: php regex preg-replace preg-replace-callback

在这个片段中,我在PHP 5.5中得到了着名的错误preg_replace(): The /e modifier is deprecated, use preg_replace_callback

    if (stripos($message, '[' . $tag . ']') !== false)
        $message = preg_replace('~\[' . $tag . ']((?>[^[]|\[(?!/?' . $tag . '])|(?R))+?)\[/' . $tag . ']~ie',
            "'[" . $tag . "]' . str_ireplace('[smg', '[smg', '$1') . '[/" . $tag . "]'", $message);

我被告知我需要这样做:

  • 在函数调用中添加_callback,
  • 删除'e'修饰符,
  • 并将替换字符串替换为:

    function ($match) use ($tag) { return '[' . $tag . ']' . str_ireplace('[smg', '[smg', $match[1]) . '[/' . $tag . ']'; }
    

你能帮我解决这个问题吗?我真的不知道该怎么做......

1 个答案:

答案 0 :(得分:2)

您可以使用:

$pattern = '~(\[' . $tag . '])((?>[^[]++|\[(?!/?+' . $tag . '])|(?R))*+)(\[/'
         . $tag . '])~i';
$message = preg_replace_callback($pattern,
                                 function ($m) {
                                     return $m[1]
                                          . str_ireplace('[smg', '[smg', $m[2])
                                          . $m[3];
                                 }, $message);

注意:使用详细模式和heredoc语法编写相同模式的另一种方法(更具可读性):

$pattern = <<<EOF
~
(\[  $tag ])
( (?> [^[]++ | \[(?!/?+ $tag ]) | (?R) )*+ )
(\[/ $tag ])
~ix
EOF;