使用GuzzleHttp获取NDBC文本文件时如何保留换行符?
解决GuzzleHttp获取NDBC文本时丢失换行符的问题
嘿,我之前也碰到过类似的坑!别着急,咱们一步步来搞定它:
首先得搞清楚问题根源:AJAX能保留换行是因为浏览器会自动识别文本里的各种换行符(不管是\n、\r\n还是\r),但PHP里处理的时候如果没注意细节,就容易踩坑。
第一步:先确认内容里到底有没有换行符
别着急改代码,先验证下Guzzle返回的内容里是不是真的没换行。加几行调试代码试试:
$url = "http://www.ndbc.noaa.gov/data/latest_obs/41004.txt"; $res = $this->httpClient->request('GET', $url); $content = $res->getBody()->getContents(); // 检查是否存在Unix或Windows风格的换行符 var_dump(strpos($content, "\n") !== false); // 检查\n var_dump(strpos($content, "\r\n") !== false); // 检查\r\n
如果这两个有一个返回true,说明换行符其实没丢,只是你解析的时候只盯着一种换行符(比如只按\n分割),这时候换个分割方式就行。
第二步:用兼容所有换行符的方式解析内容
NDBC的文本用的是Windows风格的\r\n换行,如果你之前只按\n分割,自然会出问题。推荐用PHP PCRE的\R元字符,它能匹配任何换行符序列(\r\n、\r、\n都能搞定):
$url = "http://www.ndbc.noaa.gov/data/latest_obs/41004.txt"; $res = $this->httpClient->request('GET', $url); $content = $res->getBody()->getContents(); // 把内容分割成每行,trim是去掉首尾的空白行 $lines = preg_split('/\R/', trim($content)); // 现在就可以正常遍历每行解析了 foreach ($lines as $line) { // 处理多空格分隔的字段,先把连续空格换成单个空格再拆分 $data = explode(' ', preg_replace('/\s+/', ' ', $line)); // ... 你的后续解析逻辑 }
第三步:如果真的没拿到换行符,试试禁用压缩
极少数情况下,服务器返回的是gzip压缩后的内容,虽然Guzzle默认会自动解压,但万一出了幺蛾子,你可以手动设置请求头,让服务器返回原始未压缩的内容:
$res = $this->httpClient->request('GET', $url, [ 'headers' => [ 'Accept-Encoding' => 'identity' // 告诉服务器不要压缩内容 ] ]); $content = $res->getBody()->getContents();
额外提醒:输出到网页时的换行问题
如果你是把内容输出到HTML页面,直接echo的话换行符会被浏览器忽略,这时候要么把内容放在<pre>标签里(保留原始格式),要么把换行符替换成<br>:
// 保留原始格式输出 echo '<pre>' . htmlspecialchars($content) . '</pre>'; // 或者转换为HTML换行 echo nl2br(htmlspecialchars($content));
内容的提问来源于stack exchange,提问作者mtpultz
相关产品推荐
相关产品推荐

