首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 處理 Textarea 換行符完整指南:讀取、分割與正確輸出

     編輯:PHP 相關知識

前言

在 PHP 開發中,處理 <textarea> 的換行符是常見卻容易踩坑的環節。瀏覽器提交的資料、資料庫存儲的格式、以及再次輸出到頁面時的顯示,三者之間的換行符差異(\r\n、\n、\r、HTML 的 <br>)若處理不當,會導致資料顯示錯亂或存儲異常。本文將系統梳理「讀取分割」與「賦值輸出」兩大核心場景,並附上實測代碼與圖解驗證。

一、讀取 Textarea 內容並逐行處理

當表單提交後,$_POST['textarea'] 獲得的是一整塊字符串。要逐行處理,需先按換行符分割成數組。

核心代碼

$names = preg_split('/\r\n/', $_POST['textarea']);
foreach ($names as $name) {
    // todo something eg: echo $name;
}

關鍵點:

  • Windows 系統下 textarea 提交的換行符為 \r\n(CRLF),故正則用 /\r\n/。
  • 若需兼容 Linux/Mac(\n)或舊 Mac(\r),可改用 /\r\n|\r|\n/ 或直接用 preg_split('/\R/')(PHP 7+ 支援 Unicode 換行序列)。

二、向 Textarea 輸出換行符(賦值回顯)

這是最易出錯的一步。若直接將數組用 \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)。
  • 瀏覽器解析 HTML 實體後,textarea 內部會還原為真正的換行符,實現多行顯示。

三、實戰驗證:nl2br() 與不同環境下的換行表現

為直觀展示 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>

測試步驟與結果分析

  1. 在 textarea 輸入多行文字(按 Enter 換行)並提交。
  2. 觀察瀏覽器輸出:nl2br() 會在每個 \r\n 前插入 <br>,而非替換。
  3. 用記事本打開頁面源碼:可見原始換行符為 \r\n(Windows)。
  4. 結論:
    • nl2br() 是「在換行符前插入 <br>」,不會移除原換行符。
    • Windows 標準換行符為 \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,文本框用實體。希望本文能幫你徹底告別換行符亂碼煩惱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved