行结束符\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";
相关推荐
JaguarJack1 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954482 天前
CTF 伪协议
php
BingoGo4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack6 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo6 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack7 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel