2014-01-25 63 views
1

在这段代码中,我得到了PHP 5.5中着名的错误preg_replace(): The /e modifier is deprecated, use preg_replace_callback用preg_replace_callback替换/ e修饰符

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 . ']'; } 
    

你能帮助我吗?我真的不知道该怎么做......

+0

添加一个示例字符串,如果希望某人做出的不仅仅是一个简单的翻译并改进您的代码,您希望获得的帮助将非常有用。 –

+0

如果我理解得很清楚,这个目标是用'['替换'[$ tag]'标签中所有嵌套级别内的'smg'之前的所有'[''? –

+0

只要我发现,就会告诉你! – MultiformeIngegno

回答

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

注意:用其它方法(更易读)写有详细模式和定界符相同的模式:

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

感谢您的回复! :)为什么这个$ m? – MultiformeIngegno

+0

@MultiformeIntgno:'$ m'是匹配数组:'$ m [0] =>全局匹配,'$ m [1] =>捕获组1',...当您将名称你想)作为匿名函数的参数。 –

+0

谢谢!明天测试你的片段,并让你知道! :) – MultiformeIngegno

相关问题