我正在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()等函数),如何检查一行中两个以上换行符的实例(它们之间是否有空格)然后将它们改为总共两个换行符?
答案 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
模式修饰符仅在正则表达式中有点元字符时才起作用。因为模式中没有.
,所以修饰符是无用的,正在教研究人员毫无意义/不正确的编码实践。