删除第一个换行符preg_replace

时间:2009-09-23 21:53:44

标签: php regex preg-match bbcode

我正在编写一些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>

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

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

/\[quote\]\s*(.+?)\s*\[\/quote\]/s

答案 1 :(得分:0)

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

答案 2 :(得分:0)

可能会使用“eregex-modifier来调用字符串上的trim函数。

引用手册的那一页:

  

e PREG_REPLACE_EVAL
如果设置了此修饰符,preg_replace()   正常替代   替换中的反向引用   string,将其评估为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函数 - 注意它将删除字符串开头和结尾的所有空格;不仅是换行符,还有空格和表格。

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