我啥时候使用 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
通常应该用于特定于平台的输出。
\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 客户端问题的主要内容,如果未能解决你的问题,请参考以下文章
我啥时候应该使用 CROSS APPLY 而不是 INNER JOIN?