fab*_*bio 22 php ajax jquery post line-breaks
我有一个php解析器,它通过换行符拆分给定的字符串,执行如下操作:
$lines = explode(PHP_EOL,$content);
Run Code Online (Sandbox Code Playgroud)
在服务器端工作时,解析器工作正常.但是,当我通过ajax(使用jquery的$ .post方法)通过post传递内容时,问题就出现了:不会识别换行符.经过近一个小时的测试和头痛后,我决定将PHP_EOL改为"\n"并且它有效:
$ lines = explode("\n",$ content);
现在它有效!该死的我失去了这么多时间!当有人正确地使用PHP_EOL和"\n"时,有人可以解释一下,这样我以后可以节省时间吗?感谢你的答案;)
mar*_*rio 44
常量PHP_EOL通常应用于特定于平台的输出.
\n←→ .\r\nfopen(…, "wb")但是对于文件输入,您应该更喜欢\n.虽然大多数网络协议(HTTP)都应该使用\r\n,但这并不能保证.
因此,最好分手\n并\r手动删除任何可选项:
$lines = array_map("rtrim", explode("\n", $content));
Run Code Online (Sandbox Code Playgroud)
或者立即使用该file(…, FILE_IGNORE_NEW_LINES)功能,将EOL处理留给PHP或auto_detect_line_endings.
一个更强大和更简洁的替代方案是使用preg_split()和正则表达式:
$lines = preg_split("/\R/", $content);
Run Code Online (Sandbox Code Playgroud)
该\R占位符检测的任何组合\r+ \n.所以最安全,甚至适用于Classic MacOS ? 9文本文件(在实践中很少见).
强制性微优化注意事项:
虽然正则表达式具有成本,但它通常比PHP中的手动循环和字符串后处理更快.
还有一些经典的例子,你应该避免由于它的平台模糊: PHP_EOL
fsockopen().mail()和MIME构造(实际上,你不应该自己做乏味的事情).\n换行符.因此,"\r\n"在不写入文件时使用文字组合,但为期望网络换行符的特定上下文准备数据.
PHP_EOL是一个常量,包含服务器平台使用的换行符.在Windows的情况下,它是\r\n.在*nix上,它是\n.你显然有一个Windows服务器.
如果你在*nix服务器上,那么这个改变就不会修复它,因为它会是\n.如果要将数据发送到客户端(即浏览器),则应使用\r\n以确保识别换行符.