【问题标题】:Replacing /e modifier with preg_replace_callback用 preg_replace_callback 替换 /e 修饰符
【发布时间】:2014-02-16 22:16:34
【问题描述】:

在这个 sn-p 中,我在 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 . ']'; }
    

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

【问题讨论】:

  • 添加一个示例字符串以及您希望获得的内容将非常有帮助,如果希望有人做的不仅仅是简单的翻译并改进您的代码。
  • 如果我理解得很好,这样做的目的是用[ 替换[$tag] 标记内所有嵌套级别中smg 之前的所有[
  • 我一发现就会告诉你!

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


【解决方案1】:

你可以用这个:

$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;

【讨论】:

  • 感谢您的回复! :) 为什么是 $m ?
  • @MultiformeIngegno: $m 是匹配数组:$m[0] =&gt; global match, $m[1] =&gt; capture group 1, ... 它是在您将名称(您想要的)作为匿名函数的参数时定义的。
  • 谢谢!明天将测试您的 sn-p 并让您知道! :)
  • 我应该保留 if 行吗?
  • @MultiformeIngegno:不,它(并且曾经)没用。
猜你喜欢
  • 2013-03-05
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多