1

我正在编写一些 PHP 来将 BBcode 转换为 HTML。

我想转换这个BBcode:

[quote]
Hello World
[/quote]

到以下:

<blockquote>Hello World</blockquote>

我用来执行此操作的 preg_replace 函数是:

preg_replace("/\[quote\](.+?)\[\/quote\]/s", "<blockquote>\\1</blockquote>", $bbCode);

这几乎可以完成我需要做的所有事情,但我的问题是它在“Hello World”之前和之后通过 \n,并产生:

<blockquote>
Hello World
</blockquote>

有什么想法可以解决这个问题吗?非常感谢所有帮助。

4

3 回答 3

1

试试这个正则表达式:

/\[quote\]\s*(.+?)\s*\[\/quote\]/s
于 2009-09-23T21:57:42.767 回答
0

您需要在双引号内转义反斜杠。您需要“\\[”而不是“\[”。

于 2009-09-23T21:57:30.630 回答
0

例如,一种可能性是使用 ' e' regex-modifier来调用trim字符串上的函数。

引用手册的那一页:

e ( PREG_REPLACE_EVAL)
如果设置了此修饰符,preg_replace() 则正常替换替换字符串中的反向引用,将其评估为 PHP 代码,并使用结果替换搜索字符串。单引号、双引号、反斜杠 ( \) 和NULL 字符将被替换反向引用中的反斜杠转义。

preg_replace()使用这个修饰符;它被其他 PCRE 函数忽略。


例如,此代码与您的代码略有不同:

$bbCode = <<<STR
[quote]
Hello World
[/quote]
STR;

$output = preg_replace("/\[quote\](.+?)\[\/quote\]/es", "'<blockquote>' . trim('\\1') . '</blockquote>'", $bbCode);
var_dump($output);

会给你:

string '<blockquote>Hello World</blockquote>' (length=36)

即,在trim匹配的内容上调用该函数-注意它将删除字符串开头和结尾的所有空格;不仅是换行符,还有空格和制表符。

(例如,您可以查看手册页preg_replace上的示例 #4 )
(在这种情况下,我应该补充一下,这可能有点矫枉过正——但无论如何很高兴知道)

于 2009-09-23T22:00:01.280 回答