【发布时间】: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);
然后无论如何,关闭标签都是通过我的正常标签替换搜索来获取的。
【问题讨论】: