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










