用戶在 <textarea> 中輸入多行文本提交後,PHP 接收到的數據包含換行符。直接存入數據庫或前端 JS 調用時,常因換行符處理不當導致:
| 環境 | 換行符表示 | ASCII 碼 |
|---|---|---|
| Windows | \r\n (CRLF) | 13 + 10 |
| Linux/Unix/macOS | \n (LF) | 10 |
| 舊版 Mac OS | \r (CR) | 13 |
PHP 中 chr(13) 即 \r,chr(10) 即 \n。
<?php
if ($_POST) {
// 錯誤:僅替換 \r,遺留 \n 導致 JS 報錯;且邏輯混亂
$textarea = str_replace('n', '', str_replace(chr(13), '', $_POST['textarea']));
echo $textarea;
}
?>
問題:'n' 是字符「n」,而非 \n;未處理 \r\n 組合;直接輸出未轉義字符串極易導致 JS 語法錯誤。
<?php
$text = $_POST['textarea'] ?? '';
// 統一將各種換行符轉為 <br>
$html = nl2br(htmlspecialchars($text, ENT_QUOTES, 'UTF-8'));
echo $html;
?>
nl2br() 會在 \n、\r\n、\r 前插入 <br>,配合 htmlspecialchars() 防 XSS。
<?php
$text = $_POST['textarea'] ?? '';
// 僅做安全過濾,保留 \n
$safeText = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
// 入庫前可統一轉為 \n(可選)
$normalized = str_replace(["\r\n", "\r"], "\n", $safeText);
// 執行入庫操作...
?>
<script>
var textareaData = <?php echo json_encode($normalized, JSON_UNESCAPED_UNICODE); ?>;
console.log(textareaData); // 安全的 JS 字符串,含 \n 轉義
</script>
json_encode() 會自動將換行符轉義為 \n,雙引號轉義為 \",徹底消除 JS 語法錯誤。
<?php
// 1. 獲取並標準化換行符為 \n
$raw = $_POST['content'] ?? '';
$normalized = str_replace(["\r\n", "\r"], "\n", $raw);
// 2. 不同場景輸出
// 【頁面直接顯示】
$forDisplay = nl2br(htmlspecialchars($normalized, ENT_QUOTES, 'UTF-8'));
// 【JS 變量賦值】
$forJS = json_encode($normalized, JSON_UNESCAPED_UNICODE);
// 【入庫存儲】
$forDB = $normalized; // 配合預處理語句防注入
?>
<!-- 頁面顯示 -->
<div class="content"><?php echo $forDisplay; ?></div>
<!-- JS 調用 -->
<script>
const content = <?php echo $forJS; ?>;
// 安全使用 content 變量
</script>
\n。nl2br + htmlspecialchars,JS 用 json_encode,數據庫存原始 \n。json_encode()。