【问题标题】:bbcode style tags with preg带有 preg 的 bbcode 样式标签
【发布时间】:2010-04-01 15:38:45
【问题描述】:

好的,我一直在为我的论坛中的 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 并将其替换为内联的 URL 类似,因此输出为:

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

在 html 中,a 标记已经关闭,这意味着将 url 剥离出来,存储它,然后替换它。

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

编辑:

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

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

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

【问题讨论】:

    标签: php pcre


    【解决方案1】:

    试试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]'
        );
    

    【讨论】:

    • 嗯,如果我没看错,它会替换整个配对标签?输出很好,因为它给了我一个跨度类,但它不需要搜索结束引号标签?由于两个标签都被替换,它正在改变嵌套并且它不适用于嵌套引号。结束标签可以用第二遍替换,因此不需要包含。所以我需要改变它,只用&lt;span class="quote"&gt;Chris says &lt;br /&gt;替换[quote=chris]部分,为结束标签添加另一个替换将消除嵌套问题。
    • 啊,谢谢,我读错了,它正在搜索标签之间的文本,但没有替换结束标签,我已经把它拿出来并稍微修改了一下。但是对于正确方向的点 +1!
    • 很高兴我能帮上忙。与其给你一个完整的解决方案,我只是想说明如何使用这个函数来解决你的问题。
    • 是的,我添加了上面的修改代码以供参考,感谢指针,正则表达式仍然吓到我!
    猜你喜欢
    • 2015-01-17
    • 2012-05-10
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多