行结束符\r\n和\n坑人一例

起因,我想利用一个记录了mac地址列表的文本文件,产生类似与map的格式。mac.txt 内容如下(为了方便叙述,只保留了5行):

98EECB8C6766

98EECB89E357

98EECB8C7879

98EECB8C6A10

98EECB8C6828

处理脚本 format.php 如下:

php 复制代码
<?php

$content = file_get_contents('mac.txt');
$lines = explode("\n", $content);
var_dump($lines);

for ($i = 0; $i < count($lines); $i++) {
    echo '"'.$lines[$i].'":'.($i+1).",\n";
}

结果,输出的内容有点怪异:

bash 复制代码
array(5) {
  [0]=>
" string(13) "98EECB8C6766
  [1]=>
" string(13) "98EECB89E357
  [2]=>
" string(13) "98EECB8C7879
  [3]=>
" string(13) "98EECB8C6A10
  [4]=>
  string(12) "98EECB8C6828"
}
":1,ECB8C6766
":2,ECB89E357
":3,ECB8C7879
":4,ECB8C6A10
"98EECB8C6828":5,

当时心急,调试了半天不知道问题在哪里。怪也怪我看看内容简单,当时心又急,就想粗暴使用 file_get_contents 和 explode 解决问题,没有耐心分析原因,只知道瞎改输出格式,就没有找到问题。

问题就出在你没法知道 mac.txt 的行结束符使用的是 \n 还是 \r\n。正好 mac.txt 是 Windows 下拷贝终端输出到记事本生成的,而上述代码用 \n 来分割内容,从而数组每个元素是字符串 xxxx\r,在输出时,因为\r,后续的输出内容会覆盖前面的输出内容。

知道了原因自然好办了,给 echo 语句加 trim 就行:

php 复制代码
echo '"'.trim($lines[$i]).'":'.($i+1).",\n";
相关推荐
BingoGo2 分钟前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 分钟前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5