在 PHP 開發中,處理 <textarea> 的換行符是常見卻容易踩坑的環節。瀏覽器提交的資料、資料庫存儲的格式、以及再次輸出到頁面時的顯示,三者之間的換行符差異(\r\n、\n、\r、HTML 的 <br>)若處理不當,會導致資料顯示錯亂或存儲異常。本文將系統梳理「讀取分割」與「賦值輸出」兩大核心場景,並附上實測代碼與圖解驗證。
當表單提交後,$_POST['textarea'] 獲得的是一整塊字符串。要逐行處理,需先按換行符分割成數組。
$names = preg_split('/\r\n/', $_POST['textarea']);
foreach ($names as $name) {
// todo something eg: echo $name;
}
關鍵點:
\r\n(CRLF),故正則用 /\r\n/。\n)或舊 Mac(\r),可改用 /\r\n|\r|\n/ 或直接用 preg_split('/\R/')(PHP 7+ 支援 Unicode 換行序列)。這是最易出錯的一步。若直接將數組用 \n 連接輸出到 <textarea>,瀏覽器可能不換行;若用 <br> 則會顯示標籤原文。正確做法是使用換行符的 HTML 實體編碼:
(即 \r\n)。
$vals = get_from_mydb(); // 從資料庫讀取數組
$tmp = '';
foreach ($vals as $val) {
$tmp .= $val . '
'; // 關鍵:使用 HTML 實體編碼
}
echo '<textarea>' . $tmp . '</textarea>';
原理解析:
= \r (CR),
= \n (LF)。為直觀展示 PHP 內建函數 nl2br() 及各系統換行符差異,構建測試頁面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP Textarea 換行測試</title>
</head>
<body>
<?php
$content = empty($_POST['content']) ? null : trim($_POST['content']);
if (!empty($content)) {
// 1. nl2br() 在 \r\n 前插入 <br>
echo str_replace("\r", '\r', nl2br($content));
echo "\r<br/>----------分割線----------------------\r";
// 2. 單獨替換 \n
echo str_replace("\n", '\n', nl2br($content));
echo "\n<br/>----------分割線----------------------\n";
// 3. 同時替換 \r 和 \n
echo str_replace("\r", '\r', str_replace("\n", '\n', nl2br($content)));
echo "\r<br/>----------分割線----------------------<br/>\n";
echo 'hello' . "\n" . 'boys!';
echo 'hello' . "\r" . 'boys!';
}
?>
<form action="" method="post">
<textarea name="content" cols="50" rows="6"></textarea><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
nl2br() 會在每個 \r\n 前插入 <br>,而非替換。\r\n(Windows)。nl2br() 是「在換行符前插入 <br>」,不會移除原換行符。\r\n。\r 或 \n 單獨出現也能換行,但規範開發應統一用 \r\n 或 \n。


| 場景 | 推薦做法 | 避坑提示 |
|---|---|---|
| 讀取並分割 | preg_split('/\R/', $str) (PHP 7+) 或 preg_split('/\r\n|\r|\n/') | 勿假設固定 \r\n,需兼容跨平台 |
| 存入資料庫 | 統一轉為 \n 存儲:str_replace(["\r\n","\r"], "\n", $str) | 避免混合換行符導致後續查詢匹配失敗 |
| 輸出到 HTML 頁面 | nl2br(htmlspecialchars($str)) | 必須先 htmlspecialchars 防 XSS,再 nl2br |
| 回填到 Textarea | 用
連接:implode('
', $arr) | 切勿用 \n、<br> 或 \r\n 直接輸出 |
掌握換行符的「分割、存儲、輸出」三部曲,能讓 PHP 處理表單文本更加健壯。核心口訣:讀取兼容 \R,存儲統一 \n,網頁 nl2br,文本框用實體。希望本文能幫你徹底告別換行符亂碼煩惱。