行结束符\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";
相关推荐
闲云野鹤在人间13 小时前
docker 入门 | 第5章 网络详解
网络·docker·架构·华为云·php
PHP实战开发录15 小时前
MySQL连接数为什么会打满
系统架构·php·开发
VXbishe15 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
aixingpan16 小时前
aixingpan.cn API开发文档:api_docs_bichart_natalvssolar_return2接口指南
前端·php
曦夜日长17 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
4SAPI1 天前
企业大模型API服务商推荐:从多模型接入到AI API Gateway的技术选型分析
人工智能·php
子非鱼a2 天前
【WEB】[NewStarCTF 2023 公开赛道]include 0。0
php
DevUp2 天前
停更老站往哪搬:PHP 老站的五条出路(番外七)
php·cms
专业程序开发源2 天前
springboot旅游推荐系统82074-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·php·课程设计·旅游
sbjdhjd2 天前
从“删除后重生”到认证绕过:PHP 常驻内存实验与 Cacti remote_agent 命令执行链路复盘
安全·web安全·网络安全·数据挖掘·php·网络攻击模型·安全架构