使用正则表达式删除冗余换行符

时间:2009-05-03 01:53:06

标签: php regex duplicates pcre line-breaks

我正在PHP中开发一个single serving site,它只显示访问者发布的消息(理想情况下围绕网站主题)。任何人都可以每小时发布三条消息。

由于网站只有一页,我想控制每条消息的垂直长度。但是,我确实希望至少部分保留原始邮件中的换行符。折衷方案是允许两个换行符,但如果有两个换行符,则将它们替换为一行中总共两个换行符。 Stack Overflow实现了这一点。

例如:

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

将更改为

“Porcupines< br />< br />< br /> porcupiney。”

检查换行符的一个棘手方面是它们被收集并存储为\ r \ n,\ r或\ n的可能性。我想过使用nl2br()将所有换行符转换为< br /> s,但这似乎没必要。

我的问题:在PHP中使用正则表达式(使用preg_match()和preg_replace()等函数),如何检查一行中两个以上换行符的实例(它们之间是否有空格)然后将它们改为总共两个换行符?

3 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:6)

这样的东西
preg_replace('/(\r|\n|\r\n){2,}/', '<br/><br/>', $text);
我想,

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

答案 2 :(得分:0)

\R是与系统无关的escape sequence,它将与\n\r\r\n匹配。

由于要贪婪地匹配1或2个连续的换行符,因此需要使用限制量词{1,2}

代码:(Demo

$string = "Porcupines\nare\n\n\n\nporcupiney.";

echo preg_replace('~\R{1,2}~', '<br />', $string);

输出:

Porcupines<br >are<br /><br />porcupiney.

现在,要阐明其他答案不正确的原因/地方...

@DavidZ的无法解释的答案由于量词表达不正确而无法替换单独的换行符(Demo of failure)。

它生成:

Porcupines\nare<br/><br/>porcupiney.

@chaos的纯代码答案(Demo of failure)可以产生完全相同的结果。正则表达式不仅耗时长且错误地实现了量词逻辑,而且还添加了s模式修饰符。

s模式修饰符仅在正则表达式中有点元字符时才起作用。因为模式中没有.,所以修饰符是无用的,正在教研究人员毫无意义/不正确的编码实践。