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 换行序列,即不仅是 LF
、CR
、CRLF
,而且还包括更奇特的诸如 VT
、FF
、NEL
、LS
和 @ 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 内存爆炸
Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为