0

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

有两个标签给我带来了问题,因为我需要对它们做的事情更复杂。[quote]and[url]很好,但是,我想让用户选择[quote=person_to_quote]and [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 并将其替换为内联的 URL 类似,因此输出为:

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

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

那么我用什么方法来删除=和结束]标签之间的文本,这样我传入替换数组的内容就可以被传递出去并进行相应的修改。此外,我不担心嵌套在quotesspan 类样式中,但我确实需要一个可以处理任意数量的引号标签的函数!请思考。

编辑:

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

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

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

4

1 回答 1

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]'
    );
于 2010-04-01T16:03:48.957 回答