windows和linux服务器中的爆炸错误\r\n和\n

Posted

技术标签:

【中文标题】windows和linux服务器中的爆炸错误\\r\\n和\\n【英文标题】:explode error \r\n and \n in windows and linux serverwindows和linux服务器中的爆炸错误\r\n和\n 【发布时间】:2011-08-11 19:01:52 【问题描述】:

我使用了explode 函数将textarea 的contain 放入基于行的数组中。当我在本地主机(WAMPserver 2.1)中运行此代码时,它与此代码完美配合:

$arr=explode("\r\n",$getdata);

当我上传到我的 linux 服务器时,我需要每次将上面的代码更改为:

$arr=explode("\n",$getdata);

什么将是我的永久解决方案。哪个通用代码适用于我的两个服务器?

谢谢

【问题讨论】:

【参考方案1】:

常量 php_EOL 包含依赖于平台的换行符,所以你可以试试这个:

$arr = explode(PHP_EOL, $getdata);

但更好的是规范化文本,因为您永远不知道访问者使用什么操作系统。这是规范化仅使用 \n 作为换行符的一种方法(但也请参阅 Alex 的回答,因为他的正则表达式将处理所有类型的换行符):

$getdata = str_replace("\r\n", "\n", $getdata);
$arr = explode("\n", $getdata);

【讨论】:

一些操作系统使用 \r 作为换行符,你也需要处理它。 GordonM,你是对的。十年前的 Mac OS 9 使用 \r(以及 80 年代的一些系统),但我认为没有人在那个旧软件上运行 Web 服务器。 确实如此,但保护你的基地永远不会受到伤害:) PHP_EOL 常量是相对于服务器环境的,输入数据可能有其他来源。 Alix,没错,这就是为什么最好对输入进行标准化。您的正则表达式可能是最好的解决方案(我也在澄清我的答案,但不会窃取您的名声:-))。【参考方案2】:

据我所知,用换行符分割字符串的最佳方法是 preg_split\R

preg_split('~\R~', $str);

\R 匹配任何 Unicode 换行序列,即不仅是 LFCRCRLF,而且还包括更奇特的诸如 VTFFNELLS 和 @ 987654334@.

如果不需要这种行为(为什么?),您可以指定 BSR_ANYCRLF 选项:

preg_split('~(*BSR_ANYCRLF)\R~', $str);

这将仅匹配“经典”换行符序列。

【讨论】:

【参考方案3】:

嗯,最好的方法是将您的输入数据标准化为只使用\n,如下所示:

$input = preg_replace('~\r[\n]?~', "\n", $input);

自:

Unix 使用\n。 Windows 使用\r\n。 (旧)Mac OS 使用\r

尽管如此,\n 的爆炸应该会给你带来最好的结果(如果你不规范化的话)。

【讨论】:

【参考方案4】:

PHP_EOL 常量包含主机操作系统换行符的字符序列。

$arr=explode(PHP_EOL,$getdata);

【讨论】:

【参考方案5】:

您可以使用preg_split(),这将使它无论如何都可以工作:

$arr = preg_split('/\r?\n/', $getdata);

【讨论】:

以上是关于windows和linux服务器中的爆炸错误\r\n和\n的主要内容,如果未能解决你的问题,请参考以下文章

与 foreach 并行预测 nnet 输出时 R 内存爆炸

R Shiny服务器分段错误

Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为

火花数据框爆炸功能错误

Windows 和 Linux 中的 Java ssh 连接

C Windows中的简单链表