标签添加递增行号
" />
本文教你正确实现歌词行号自动计数:通过按 `
` 分割字符串并插入序号,而非错误地使用 `php_eol`,从而精准为每行歌词生成递增编号。
在处理 HTML 格式歌词时,常见的需求是为每段换行(即每个
)添加行号,例如用于卡拉 OK 显示或排版标注。但原代码中使用 explode(PHP_EOL, $lyrics) 是根本性错误——因为 $lyrics 是一个单行 HTML 字符串(所有内容在 PHP 中实际存储为一行),其中的
并非系统换行符,PHP_EOL 在此完全不匹配,导致 explode() 返回仅含一个元素的数组,循环失去意义。
✅ 正确做法是:以
为分隔符进行分割,并在重组时注入行号。注意需保留原始
结构(或统一替换为带编号的版本),同时避免破坏 HTML 语义。以下是推荐实现:
Every time when I look in the mirror
All these lines on my face getting clearer
The past is gone
And it went by, like dusk to dawn
Isn't that the way?
Everybody's got their dues in life to pay
Yeah, I know nobody knows
Where it comes and where it goes
I know it's everybody's sin
You got to lose to know how to win
"; // 1. 移除首尾标签(可选,便于干净处理) $lyrics = trim(strip_tags($lyrics, '
')); // 仅保留
,去除其他标签 $lyrics = str_replace('
', '
', $lyrics); // 统一为
(兼容不同写法) // 2. 按
分割(注意:需转义正则或使用 str_replace 预处理) $lines = explode('
', $lyrics); // 3. 过滤空行并生成带序号的行 $output = []; foreach ($lines as $index => $line) { $line = trim($line); if ($line !== '') { $output[] = sprintf('%d. %s', $index + 1, htmlspecialchars($line)); } } // 4. 输出(用
连接,保持换行) echo '' . implode('
'; ?>
', $output) . '
? 关键注意事项:
- ❌ 不要依赖 PHP_EOL 处理 HTML 内部换行标记;HTML 的换行由
等标签控制,与文本文件换行符无关; - ✅ 使用 explode('
', $lyrics) 前建议先标准化
变体(如
,
,
),可借助 preg_replace() 实现大小写/斜杠容错; - ⚠️ 直接拼接用户输入内容存在 XSS 风险,务必使用 htmlspecialchars() 转义歌词文本;
- ? 若需保留原始
结构和样式,可在最终输出前包裹回
,或使用 DOMDocument 进行更健壮的 HTML 解析(适用于复杂场景)。
该方案简洁、可靠,适用于大多数歌词行号标注需求,确保每行
后的内容获得准确、连续的序号。










