2010-04-01 110 views
0

好的,我一直在通过一组字符串替换bbcode样式标签在我的论坛中,取代[b][i]等是相当简单的,因为我可以直接替换它们而没有问题。bbcode样式标签与preg

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

所以我需要能够替换开始标记[quote=然后保留字符串添加]显示报价然后结束[/quote]。我可以更换批发标签并保留=person的罚款,但这是由我作弊和简单地添加结束标签的文本。我真的很想能够做的就是将=]之间的所有内容都存储起来,以便我可以单独处理它。

目前我使用一个数组,simplye从而取代了嵌入式文本:

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

,只是拍着非替换文本回到它的结束,这是丑陋的,但。我希望能够做的就是把代码说[quote=person]some text here[/quote],使之成为:

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

其中$的人会存储这个人的名字,因此它可以被动态替换的变量。

与网址

同样地,我想更换[url=link]link text[/url],使之能够接受的URL和内嵌更换所以输出:

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

与HTML标签已经关闭,这意味着剥离url出来,存储它然后替换它之后。

那么,我用什么方法来删除=和关闭]标签之间的文本,所以我传入替换数组可以传递出来,并相应地修改。另外,我并不担心嵌套在quotes中,因为span类样式会照顾到这一点,但是我确实需要一个可以处理任意数量的引号标签的函数!请仔细阅读。

编辑:

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

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

然后关闭标签回升无论如何,通过我的普通标签替换搜索。

回答

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

嗯,如果我读的是正确的替换整个配对标签?输出很好,因为它给了我一个跨度类,但它不需要搜索结束标记?由于两个标签都被替换,它正在改变嵌套,并且它不能在嵌套引号上工作。结束标签可以替换为第二遍,因此不需要包含。所以我需要改变它,只用'替换'[quote = chris]'部分Chris说
'为结束标记添加另一个替换将会消除嵌套问题。 – TooManyCooks 2010-04-01 16:43:02

+0

啊,谢谢,我读的时候有点不对,它正在搜索标签之间的文本,但没有替换结束标签,我已经采取了一些措施并修改了它。但在正确的方向点+1! – TooManyCooks 2010-04-01 16:57:45

+0

很高兴我能帮到你。我只想说明如何使用这个函数来解决你的问题,而不是给你一个完整的解决方案。 – webbiedave 2010-04-01 16:59:35