在 PHP 開發中,處理 textarea 表單提交的換行符是常見需求,但也容易踩坑。本文記錄我從誤解 nl2br() 行為,到發現單雙引號差異導致 str_replace() 失效的完整排查過程,希望能幫助大家避開同樣陷阱。
textarea 中按下 Enter 產生的換行符在 Windows 通常是 \r\n,Linux/Unix 則是 \n。PHP 端接收時需兼容處理。
官方文檔說明:nl2br() 在字符串中每個換行符(\n、\r\n、\r)之前插入 <br />,但不會移除原有換行符。
// 輸入: "程序\n生活網"
// nl2br() 後: "程序<br />\n生活網"
// 瀏覽器渲染會換兩行:一次因 <br />,一次因殘留的 \n
初期嘗試 str_replace('\n', '<br />', $str) 卻無效。經測試發現:
'\n' 視為字面上的反斜線加 n,而非換行符。"\n" 正確表示換行符(ASCII 10)。修正為 str_replace("\n", '<br />', $str) 即可正常替換。
"\n"、"\r\n")。str_replace(["\r\n", "\r", "\n"], '<br />', $str)。preg_replace('/\R/', '<br />', $str)(\R 匹配所有 Unicode 換行序列)。這個問題的核心在於 PHP 字符串解析機制:單引號不解析轉義,雙引號解析。看似基礎,卻極易在實戰中被忽略。建議養成「換行符用雙引號」的肌肉記憶,並閱讀官方文檔確認函數行為,避免陰溝翻船。