5

我正在寻找类似 trim() 但在字符串范围内的东西。用户有时会在输入后输入 2、3、4 或更多行回车,我需要清理此输入。

样本输入

i like cats


my cat is happy
i love my cat



hope you have a nice day

期望的输出

i like cats

my cat is happy
i love my cat

hope you have a nice day

我没有看到任何内置的东西,字符串替换需要多次迭代才能完成工作。在我提出一个小的递归字符串替换之前,我想看看你们还有什么其他建议。

我有一种奇怪的感觉,这个也有一个正则表达式。

4

5 回答 5

10
function str_squeeze($body) {
    return preg_replace("/\n\n+/", "\n\n", $body);
}
于 2009-04-08T06:00:13.337 回答
3

你需要多少文字才能做到这一点?如果它小于约 100k,那么您可能只使用简单的搜索并替换正则表达式(搜索类似的内容/\n+/并替换为\n

另一方面,如果您需要遍历兆字节的数据,那么您可以逐个字符地解析文本,将输入复制到输出,除非遇到多个换行符,在这种情况下,您只需复制一个换行符并忽略休息。

不过,我不建议使用递归字符串替换,听起来会非常慢。

于 2009-04-08T05:55:23.753 回答
3

终于设法得到它,需要 preg 所以你在 php 中使用 PCRE 版本,还需要一个 \n\n 替换字符串,以便不擦除所有行尾,而是一个:

  $body = preg_replace("/\n\n+/", "\n\n", $body);

谢谢你让我走上正轨。

于 2009-04-08T07:01:21.300 回答
3

要考虑所有三个换行符序列:

preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $str)
于 2009-04-09T07:57:55.960 回答
2

以下正则表达式应删除多个换行符,同时忽略单个换行符,这在您的定义中是可以的:

ereg_replace("\n\n+", "\n\n", $string);

您可以使用这个PHP 正则表达式测试工具对其进行测试,该工具非常方便(但它似乎与 PHP 不完全一致)。

[编辑] 将 ' 修复为 ",因为它们似乎不起作用。不得不承认我刚刚在网络工具中测试了正则表达式。;)

于 2009-04-08T06:13:22.820 回答