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

2022-08-30 18:52:09

我有一个php解析器,它通过换行符拆分给定的字符串,执行如下操作:

$lines = explode(PHP_EOL,$content);

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

$lines = explode(“\n”,$content);

现在它的工作原理!该死的,我失去了这么多时间!有人可以解释一下我何时正确使用PHP_EOL和“\n”,以便我将来可以节省时间吗?感谢您的回答;)


答案 1

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

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

但是,对于文件输入,您应该更喜欢。虽然大多数网络协议(HTTP)都应该使用,但这并不能保证。\n\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 占位符检测 + 的任意组合。因此,这将是最安全的,甚至可以适用于经典MacOS文本文件(在实践中很少见)。\r\n≤ 9

    强制性的微优化说明:
    虽然正则表达式有成本,但它通常比PHP中的手动循环和字符串后处理更快。

有一些经典的例子,由于其平台模糊性,你应该避免PHP_EOL

  • 手动生成网络协议有效负载,例如 http over fsockopen()。<
  • 对于mail()和MIME构造(实际上,你不应该自己做繁琐的事情)。
  • 文件输出,如果你想一致地只写Unix换行符,而不考虑环境。\n

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


答案 2

PHP_EOL应在写入输出(如日志文件)时使用。

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


推荐