
MySQL 中存储的 换行转义序列默认不会被 HTML textarea 自动解析为换行,需通过 stripcslashes() 或其他方式还原原始换行符才能正确显示。
mysql 中存储的 ` ` 换行转义序列默认不会被 html textarea 自动解析为换行,需通过 `stripcslashes()` 或其他方式还原原始换行符才能正确显示。
在 Web 开发中,常遇到这样一个典型问题:从 MySQL 数据库读取包含换行符(如 )的文本内容,并希望在
$test_note_1 = $array_draft['notes']; // 值为 "This is line 1 This is line 2"(字符串字面量, 未被解释) $test_note_2 = "This is line 1 This is line 2"; // PHP 字符串字面量, 被解释为真实换行符 <textarea><?php echo $test_note_1 ?></textarea> <!-- 显示为单行 --> <textarea><?php echo $test_note_2 ?></textarea> <!-- 正确显示为两行 -->
根本原因在于:MySQL 存储的是字面量 (两个字符:反斜杠 + n),而非真正的换行控制符(ASCII 10)。当数据经 mysqli_fetch_array() 读出后,PHP 并不会自动将 "\n" 解析为换行符——它仍是一个普通字符串。而 $test_note_2 是在 PHP 代码中直接定义的字符串字面量,PHP 解析器会自动将 转义为 LF(Line Feed)字符,因此
✅ 正确解决方案是使用 stripcslashes() 函数:
$test_note_1 = stripcslashes($array_draft['notes']); // 将字符串中的 "\n" → " "、"\t" → " " 等转义序列还原为对应控制字符
? stripcslashes() 的作用是“取消 C 风格转义”,即把双反斜杠开头的转义序列(如 , , , )转换为对应的实际字符。它不同于 stripslashes()(仅移除反斜杠,不处理语义),更适合此场景。
立即学习“前端免费学习笔记(深入)”;
完整修复示例:
$sql_find_draft = "SELECT * FROM `draft` WHERE `id` = 46";
$result_find_draft = mysqli_query($conn, $sql_find_draft);
if (mysqli_num_rows($result_find_draft) > 0) {
$row = mysqli_fetch_assoc($result_find_draft); // 推荐用 assoc 提升可读性
$test_note_1 = stripcslashes($row['notes'] ?? '');
}
// 安全输出:防止 XSS,同时保留换行
<textarea><?php echo htmlspecialchars($test_note_1, ENT_QUOTES, 'UTF-8'); ?></textarea>⚠️ 注意事项:
- 永远不要直接 echo 用户/数据库内容到 HTML:务必结合 htmlspecialchars() 进行转义,避免 XSS 漏洞;
- 若数据在入库前已用 addslashes() 或 mysqli_real_escape_string() 处理过,且存储的是双重转义(如 "\n"),则 stripcslashes() 是必要步骤;
- 更健壮的做法是在数据写入 MySQL 前统一标准化换行符(如全部转为 ),并在读取后统一 stripcslashes() 或使用 str_replace('\n', " ", $str);
- 现代替代方案:考虑使用 JSON 格式存储富文本字段(配合 json_encode()/json_decode()),天然规避转义歧义。
总结:











