标签安全替换为换行符的完整方案
" />
本文详解如何在 php 中精准将 html 的 `
`(含 `
`、`
` 等变体)转换为纯文本换行符 `\n`,既保留语义化分段效果,又避免 `strip_tags()` 误删内容或正则误匹配,确保 tts 朗读自然、android 渲染正确。
在 Web 与移动端协同场景中(如通过 JSON 向 Android App 传输富格式文本),常需保留
的视觉分隔功能,但又不希望语音合成(TTS)引擎将其读作“br”——此时,简单粗暴地调用 strip_tags() 会彻底抹除所有换行,导致全文连成一串;而错误使用 preg_replace('
', '\r\n', $txt) 则因未转义正则元字符、缺少分隔符和修饰符,不仅无法匹配闭合标签(如
),还会意外替换文本中任意位置的子字符串 "br"(例如 "break" → "nreak"),造成严重语义污染。
正确的做法是:先精准将各类
标签统一转换为换行符,再清理其余 HTML 标签。推荐使用以下健壮函数:
/** * 将 HTML 中的
、
、
等标签安全替换为换行符 \n * 支持大小写不敏感及空格/斜杠变体 * * @param string $string 待处理的 HTML 字符串 * @return string 替换后的纯文本(保留换行) */ function br2nl(string $string): string { // 使用 PCRE 正则:匹配
及其常见变体(忽略大小写、允许空格和可选斜杠) return preg_replace('/
/i', "\n", $string); } // 使用示例 $mytxt = "Lorem ipsum
\nAnother lorem ipsum
\nThird section...
"; $withNewlines = br2nl($mytxt); // → "Lorem ipsum\n\nAnother lorem ipsum\nThird section...\n" $finalText = strip_tags($withNewlines); // → "Lorem ipsum\n\nAnother lorem ipsum\nThird section..."
✅ 关键要点说明:
- 正则 /\
/i 中:
);\/? 匹配可选的 /(支持
);> 匹配结尾 >;末尾 i 修饰符实现大小写不敏感; - 务必使用分隔符(如 /),否则 preg_replace() 会报错或行为异常;
- strip_tags() 应在 br2nl() 之后调用,确保
已被替换,其他标签(如、)才被安全剥离;
- 若需进一步标准化换行(如将 \n\n 转为单个 \n 或适配 Windows \r\n),可在 strip_tags() 后追加 preg_replace("/\n{2,}/", "\n", $finalText) 或 str_replace("\n", "\r\n", $finalText)。
最终输出的 $finalText 即为含纯净换行符的文本:TTS 引擎按自然段落停顿朗读,Android 端亦可直接用 TextView.setText() 显示正确分段——一举两得,无需额外解析逻辑。
立即学习“PHP免费学习笔记(深入)”;











