使用preg_replace或pre_replace_callback替换bbcode中的新行

时间:2013-02-04 18:34:18

标签: php

我写了一个基本上用这种方式调用的bbcode解析器:

echo nl2br(bb_parse($contents));

我正在使用preg_replace_callback而不是带有e修饰符的preg_replace来更新为PHP 5.4+做好准备的函数。

function strip_newline($text) 
{ 
     return preg_replace("/(\r\n|\r|\n)/", "", $text); 
}

bb_parse($text)
{
    $text = preg_replace("/\[ul\](.*)\[\/ul\]/Usie", '"<ul class=\"forum_unordered\">".strip_newline("$1")."</ul>"', $text);
    return $text;
}

我在使用preg_replace_callback完成同样的事情时遇到了麻烦。

bb_parse($text)
{
    $text = preg_replace_callback("/\[ol\](.*)\[\/ol\]/Usi", create_function('$matches', 'return preg_replace("/(\r\n|\r|\n)/", "", $matches);'), $text);
    return $text;
}

非常感谢任何帮助。谢谢。

修改

我要解析的bbcode代码是:

[ol]
[li]One[/li]
[li]Two[/li]
[/ol]

我的问题是我希望删除[ol]和[/ ol]之间的三个换行符。在不删除换行符的情况下,输出变为:

1. One

2. Two

而不是:

1. One
2. Two

1 个答案:

答案 0 :(得分:0)

我认为问题必须放在 $ matches [1]

bb_parse($text)
{
  $text = preg_replace_callback("/\[ol\](.*)\[\/ol\]/Usi", function($matches){       
    return preg_replace("/(\r\n|\r|\n)/", "", $matches[1]);
   }, $text);
   return $text;
}