我啥时候使用 PHP_EOL 而不是 \n ,反之亦然? Ajax/Jquery 客户端问题

Posted

技术标签:

【中文标题】我啥时候使用 PHP_EOL 而不是 \\n ,反之亦然? Ajax/Jquery 客户端问题【英文标题】:When do I use PHP_EOL instead of \n and vice-versa ? Ajax/Jquery client problem我什么时候使用 PHP_EOL 而不是 \n ,反之亦然? Ajax/Jquery 客户端问题 【发布时间】:2011-06-25 21:56:44 【问题描述】:

我有一个 php 解析器,它通过换行符分割给定的字符串,做这样的事情:

$lines = explode(PHP_EOL,$content);

解析器在服务器端工作时工作正常。但是,当我通过 ajax(使用 jquery 的 $.post 方法)通过 post 传递内容时,出现了问题:无法识别换行符。因此,经过近一个小时的测试和头痛后,我决定将 PHP_EOL 更改为“\n”并且它起作用了:

$lines = explode("\n",$content);

现在可以了!妈的,我浪费了这么多时间!有人可以在正确使用 PHP_EOL 和 "\n" 时向我解释一下,这样我以后可以节省时间吗?感谢您的友好回答;)

【问题讨论】:

PHP_EOL 因底层文件系统而异。 When do I use the PHP constant "PHP_EOL"? 的可能重复项 【参考方案1】:

常量PHP_EOL 通常应该用于特定于平台的输出。

实际上主要用于文件输出。 实际上文件函数已经在 Windows 系统上转换 \n ←→ \r\n,除非在 fopen(…, "wb") 二进制模式下使用。

对于文件输入,您应该更喜欢\n。虽然大多数网络协议 (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:

手动生成网络协议有效负载,例如fsockopen() 上的 HTTP。 用于mail() 和MIME 构造(实际上,您不应该自己做乏味的事情)。 文件输出,如果你想一致只写Unix \n换行符,不管环境如何。

因此,当不写入文件而是为需要网络换行符的特定上下文准备数据时,请使用文字 "\r\n" 组合。

【讨论】:

注意旧的 Mac 使用 \r,这将是一个更好的解决方案:preg_replace('~\r\n?~', "\n", $str); "虽然正则表达式是有代价的,但它通常比手动循环和字符串后处理更快" - 应该不足为奇。在编写处理脚本方面,您可能不会比实施、测试和优化正则表达式引擎的人更聪明。【参考方案2】:

恕我直言,最好使用 PHP_EOL

为了确保 PHP 和 JS 处理换行符的一致性,您可能希望使用 PHP_EOL 在 JS 中定义行尾变量

var eol = '<?php echo str_replace(array("\n","\r"),array('\\n','\\r'),PHP_EOL) ?>';

之后,使用eol分割提交的textarea内容

【讨论】:

这是一个很好的代码 sn-p,展示了如何将服务器端值“导出”到 JS 中。但整个换行问题要复杂得多,因为这个线程显示link 为什么PHP_EOL 的服务器端值在客户端很重要?【参考方案3】:

PHP_EOL 应该在写入日志文件等输出时使用。

它将生成特定于您平台的换行符。

【讨论】:

【参考方案4】:

PHP_EOL 是运行 PHP 的服务器使用的行结尾。用户提交的内容可能会以他们使用的任何格式结束行。但是,它不是在换行符上爆炸,而是使用 file() 函数,它完全符合您的要求。

【讨论】:

【参考方案5】:

PHP_EOL 是一个常量,用于保存服务器平台使用的换行符。对于 Windows,它是 \r\n。在 *nix 上,它是 \n。你显然有一个 Windows 服务器。

如果您在 *nix 服务器上,则该更改不会修复它,因为它将是 \n。如果您要向客户端(即浏览器)发送数据,则应使用\r\n 以确保能够识别换行符。

【讨论】:

以上是关于我啥时候使用 PHP_EOL 而不是 \n ,反之亦然? Ajax/Jquery 客户端问题的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该生成混合伞和凤凰伞?

我啥时候应该使用结构而不是类?

我啥时候应该使用 mongoDB 而不是关系数据库

我啥时候应该使用 CROSS APPLY 而不是 INNER JOIN?

我啥时候应该在子进程中使用`wait`而不是`communicate`?

我啥时候应该继承 EnumMeta 而不是 Enum?