2009-05-03 113 views
11

我正在开发一个single serving site的PHP,它只显示访问者发布的消息(理想情况下围绕网站主题)。任何人都可以每小时发布三条消息。使用正则表达式删除冗余换行符

由于该网站将只有一个页面,我想控制每个消息的垂直长度。但是,我确实希望至少部分保留原始邮件中的换行符。妥协是允许两个换行符,但是如果有两个以上的换行符,则用连续的总共两个换行符替换它们。堆栈溢出实现了这一点。

例如:

“豪猪\鼻孔\ n \ n \ n \ nporcupiney”。

将改为

“豪猪<登记/>是< BR /> < BR /> porcupiney”。

检查换行符的一个棘手方面是它们被收集并存储为\ r \ n,\ r或\ n的可能性。我想过使用nl2br()将所有换行转换为<,但这似乎没有必要。我的问题是:如何在PHP中使用正则表达式(函数preg_match()和preg_replace()),如何检查一行中两个以上换行符的实例(在它们之间是否有空格)和然后将它们改为总共两个换行符?

回答

30
preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text) 
+0

谢谢chaos!这完全符合要求。您的原始回复也起作用。 – tevan 2009-05-03 02:26:15

+0

原始回复没有达到您的“有或无空白空间”标准。 :) – chaos 2009-05-03 05:19:17

+0

但是当只有一个换行符时,它会将其更改为两个?它不应该像现在这样留下一个休息吗? – NonCoder 2015-05-15 00:09:22

6

喜欢的东西

preg_replace('/(\r|\n|\r\n){2,}/', '<br/><br/>', $text); 

应该工作,我想。虽然我完全不记得PHP语法,但它可能需要更多转义: -/

+0

谢谢David。我发现您发布的正则表达式的唯一问题是它不能在换行符之间容纳空格。 – tevan 2009-05-03 02:53:33

+0

啊,真的......我错过了你提到空格之间的空白部分。 – 2009-05-03 03:21:01