13

我正在用 PHP 开发一个服务站点,它只显示访问者发布的消息(最好围绕网站的主题)。任何人每小时最多可以发布三条消息。

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

例如:

Porcupines\nare\n\n\n\nporcupiney.

将更改为

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

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

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

4

4 回答 4

34
preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text)
于 2009-05-03T02:05:58.217 回答
6

就像是

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

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

于 2009-05-03T02:07:17.327 回答
1

\R是与系统无关的转义序列,它将匹配\n,\r\r\n.

因为您想贪婪地匹配 1 或 2 个连续的换行符,所以您需要使用限制量词{1,2}

代码:(演示

$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 的纯代码答案(失败演示)可以生成完全相同的结果。正则表达式不仅冗长且错误地实现了量词逻辑,而且还添加了s模式修饰符。

如果s模式中存在点元字符,则模式修饰符仅对正则表达式有影响。因为.模式中没有,所以修饰符是无用的,并且正在教研究人员无意义/不正确的编码实践。

于 2020-09-14T22:49:47.220 回答
0

我只是想补充一点,即使它没有直接回答这个问题,它可能会帮助那些想要限制换行数的人。我需要这个来限制论坛帖子中换行符的数量。我使用了上面选择的答案,并添加了这个:

//Some pre processing
$textarea_reply = str_replace("\r", "<br>", $textarea_reply);
$textarea_reply_splitByLines = explode("<br>", $textarea_reply);
$textarea_reply = "";
$line_count = 0;
$line_limit = 10;

//Re-add the line breaks with a limit of $line_limit
foreach ($textarea_reply_splitByLines as $line){
    $textarea_reply.= $line." "; 
    if($line_count<$line_limit) $textarea_reply.= "<br>";
    $line_count++;
}

无论如何,这都会将换行符的数量限制为最大数量。

于 2021-10-20T14:38:23.067 回答