好的,我在论坛中一直在为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);
然后无论如何,通过我的正常标签替换搜索来获取关闭标签。
答案 0 :(得分:2)
$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]'
);