带有preg的bbcode样式标签

时间:2010-04-01 15:38:45

标签: php pcre

好的,我在论坛中一直在为bbcode样式标签进行一系列字符串替换,替换[b][i]等非常简单,因为我可以直接替换它们而不会出现问题。

有两个标签给我带来问题,因为我需要对它们做些更复杂的事情。 [quote][url]很好,但是,我想让用户选择[quote=person_to_quote][url=URL]link text[/url][quote=]标记需要能够嵌套呢!

所以我需要能够替换开始标记[quote=然后保留字符串添加]显示引用然后结束[/quote]。我可以批量替换标签并保留=person罚款,但这是由我作弊和简单地将结束标签添加到文本中完成的。我真正希望能够做的是在=]之间存储所有内容,以便我可以单独操作它。

目前我正在使用数组,因此只需更换内联文本:

    "[quote=" is replaced by "<span class=\"quote\">[Quote: ",

然后将未替换的文本放回到它的末尾,这很难看。我希望能够做的是将代码说成[quote=person]some text here[/quote]并将其转换为:

    "[quote=" is replaced by "<span class=\"quote\">$person says: ",

其中$ person是存储人名的变量,因此可以动态替换。

与我想要替换[url=link]link text[/url]的网址类似,并使其能够接受网址并将其替换为内联,因此输出为:

"[url=" is replaced by "<a href=$URL>"

html标签已经关闭,这意味着剥离网址,存储然后替换它。

那么我使用什么方法来删除=和结束]标记之间的文本,以便传递给replace数组的内容可以相应地传递和修改。另外我并不担心在quotes中嵌套,因为span类样式会处理这个问题,但我确实需要一个可以处理任意数量的引用标记的函数!。请等一下。

编辑:

只是一个更新,我已经解决了我想做的事情,我修改了webbiedave给我的代码并且它有效:

$output = preg_replace_callback(
'/\[quote=([^\]]+)?\]/',
create_function(
'$matches',
'return \'<span class="quote">\'.$matches[1].\' says: \';'
),
$comment);

然后无论如何,通过我的正常标签替换搜索来获取关闭标签。

1 个答案:

答案 0 :(得分:2)

尝试preg_replace_callback

$output = preg_replace_callback(
        '/\[quote=([^\]]+)?\]([^\[]+)?\[\/quote\]?/',
        create_function(
            '$matches',
            'return \'"[quote=" is replaced by "<span class=\"quote\">\'.$matches[1].\' says: ",\';'
        ),
        '[quote=person]some text here[/quote]'
    );