最直接方法是先用str_replace("\r\n", "\n", $text)统一换行符,再explode("\n", $text)分割,循环中trim()去空格并生成项;空数组时应返回提示而非空,以保障JS逻辑健壮性。

用 explode() 拆字符串再循环生成
最直接
PHP 里把一段换行分隔的文本转成 HTML 列表,核心就是先按换行符切开成数组,再逐项套上 。别用正则去匹配换行——explode() 更快、更稳、更易读。
注意点:
-
explode("\n", $text)在 Windows 环境下可能漏掉\r\n,稳妥起见先用str_replace("\r\n", "\n", $text)统一换行符 - 每项需用
trim()去首尾空白,否则空行会生成空 - 如果原文含 HTML 特殊字符(如
&、),必须用htmlspecialchars()转义,否则破坏结构或引发 XSS
$text = "苹果\n香蕉\n橙子";
$lines = explode("\n", str_replace("\r\n", "\n", $text));
echo "- ";
foreach ($lines as $line) {
$line = trim($line);
if ($line !== '') {
echo "
- " . htmlspecialchars($line) . " "; } } echo "
用 preg_split() 处理混合换行符或带空行的脏数据
当输入来源不可控(比如用户粘贴、富文本编辑器导出),换行可能是 \n、\r\n、甚至多个连续换行,explode() 就不够用了。这时 preg_split() 更鲁棒。
关键参数:
立即学习“PHP免费学习笔记(深入)”;
-
preg_split('/\r\n|\r|\n/', $text, -1, PREG_SPLIT_NO_EMPTY)—— 一次匹配所有换行变体,并自动过滤空项 - 避免用
/\s+/,它会把中间空格也当分隔符,导致单词被意外切开 - 如果原始文本末尾有换行,
PREG_SPLIT_NO_EMPTY可省掉后续array_filter()
数组已存在?直接用 implode() + 字符串拼接更轻量
如果你手头已经是 PHP 数组(比如从数据库查出的标签列表),没必要再循环 echo。用 implode() 拼接 字符串,再包一层 ,性能更好、代码更短。
但要注意:
-
implode()不做 HTML 转义,必须提前处理:用array_map('htmlspecialchars', $arr) - 不要在
implode()里拼完整后再套- xxx
,这是最简路径;别试图用str_replace()补标签 - 空数组要判断,否则输出空
,语义上虽合法,但前端可能需要隐藏
$tags = ['PHP', 'JavaScript', 'CSS'];
$escaped = array_map('htmlspecialchars', $tags);
echo "- " . implode("
- ", $escaped) . "
输出前检查是否为空,避免生成无意义的空列表
很多模板里没加判空,结果页面出现孤零零的 ,既浪费 DOM 节点,又可能被 CSS 错误渲染(比如设置了 padding/margin)。这不是“美观问题”,是实际可访问性和维护成本问题。
简单做法:
- 对原始字符串:用
trim($text) === ''快速拦截 - 对数组:用
!empty($arr),别用count($arr) > 0,前者更快且兼容 null - 如果业务允许“无内容时显示提示文字”,那就用
替代空列表暂无数据
真正容易被忽略的是:前端 JS 有时会基于 document.querySelectorAll('ul li') 做逻辑,如果后端吐出空 ,JS 可能静默失败——所以判空不是“防错”,是契约。











