我有一个 php 解析器,它通过换行符分割给定的字符串,做这样的事情:
$lines = explode(PHP_EOL,$content);
解析器在服务器端工作时工作正常。但是,当我通过 ajax(使用 jquery 的 $.post 方法)通过 post 传递内容时,出现了问题:无法识别换行符。因此,经过近一个小时的测试和头痛后,我决定将 PHP_EOL 更改为“\n”并且它起作用了:
$lines = explode("\n",$content);
现在可以了!妈的,我浪费了这么多时间!有人可以在正确使用 PHP_EOL 和 "\n"时向我解释一下,这样我以后可以节省时间吗?感谢您的友好回答;)
最佳答案
常量 PHP_EOL
通常应该用于特定于平台的输出。
- 主要用于文件输出。
- 实际上文件函数已经在 Windows 系统上转换
\n
←→\r\n
除非在fopen(…, "wb")
二进制模式。
但是,对于文件输入,您应该更喜欢\n
。虽然大多数网络协议(protocol) (HTTP) 都应该使用 \r\n
,但这并不能保证。
因此最好在
\n
上拆分并手动删除任何可选的\r
:$lines = array_map("rtrim", explode("\n", $content));
或者使用
file(…, FILE_IGNORE_NEW_LINES)
立即运行,将 EOL 处理留给 PHP 或 auto_detect_line_endings .一个更健壮和简洁的替代方法是使用
preg_split()
和一个正则表达式:$lines = preg_split("/\R/", $content);
\R
placeholder检测 \r + \n 的任意组合。这将是最安全的,甚至适用于 Classic MacOS≤ 9
文本文件(在实践中很少见)。强制性微优化注意事项:
虽然正则表达式有成本,但它通常比 PHP 中的手动循环和字符串后处理更快。
还有一些经典示例,您应该避免 PHP_EOL
因为它的 platform-ambiguity :
- 手动生成网络协议(protocol)负载,例如 HTTP over
fsockopen()
. mail()
和 MIME 构造(真的,无论如何你都不应该自己做乏味的事情)。- 文件输出,如果您希望始终只写 Unix
\n
换行符,而不考虑环境。
因此,当不写入文件时使用文字 "\r\n"
组合,而是为预期网络换行符的特定上下文准备数据。
关于php - 我什么时候使用 PHP_EOL 而不是\n ,反之亦然? Ajax/Jquery 客户端问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4975411/