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

PHP 常用字串處理函數實戰:htmlentities、nl2br、quotemeta、rtrim 等詳解

     編輯:PHP 相關知識

PHP 常用字串處理函數實戰詳解

字串處理是 Web 開發高頻操作。掌握核心函數行為差異、編碼陷阱與安全性考量,能寫出更健壯的代碼。

1. htmlentities() / htmlspecialchars() — HTML 實體編碼 (防 XSS 核心)

string htmlentities(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, string $encoding = 'UTF-8', bool $double_encode = true)
  • 將**所有**可轉換字元轉為 HTML 實體 (含 `&`, `"`, `'`, `<`, `>`, 以及各語系特殊字元)。
  • htmlspecialchars() 僅轉換 `&`, `"`, `'`, `<`, `>`,**效能較好、輸出體積較小**,**防 XSS 通常足夠**。
  • 關鍵旗標:`ENT_QUOTES` (雙引號+單引號)、`ENT_SUBSTITUTE` (無效編碼替換為 )、`ENT_HTML5` (HTML5 模式)。
  • 雙重編碼**:預設 `$double_encode=true`,已轉換的實體不再轉換。若輸入可能已編碼,設 `false`。
<?php
$input = ' & "quotes" \'single\'';
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
// <script>alert("XSS")</script> & "quotes" 'single'

echo htmlentities($input, ENT_QUOTES, 'UTF-8');
// 同上,但若含 ©® 等也會轉為 © ®
?>

2. htmlspecialchars_decode() / html_entity_decode() — 解碼

  • 反向操作,將實體還原為字元。
  • `htmlspecialchars_decode()` 僅處理 `htmlspecialchars()` 產生的實體;`html_entity_decode()` 處理所有 HTML 實體 (需指定編碼)。

3. nl2br() — 換行轉 <br> (輸出預覽)

string nl2br(string $string, bool $is_xhtml = true)
  • 在 `\n`, `\r\n`, `\r` **前插入** `
    ` 或 `
    `,**不移除原換行字元**。
  • 適用於將資料庫儲存的純文字 (含換行) 在 HTML 中顯示換行效果。
  • 注意:若輸入已含 HTML 標籤,`
    ` 會插在標籤內部導致結構破壞。**建議先 `htmlspecialchars()` 再 `nl2br()`**。
<?php
$text = "第一行\n第二行\r\n第三行";
echo nl2br(htmlspecialchars($text));
// 第一行
// 第二行
// 第三行 ?>

4. quotemeta() — 正則元字元轉義 (preg_quote() 替代)

string quotemeta(string $string)
  • 在正則特殊字元 `. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -` 前加反斜線。
  • 等同 `preg_quote($str, '')` (無分隔符)。
  • **不處理分隔符**;若用於動態建構正則,需自行轉義分隔符或改用 `preg_quote($str, '/')`。
<?php
$pattern = quotemeta('cost: $100 (50% off)'); // cost: \$100 \(50\% off\)
echo "/$pattern/"; // 可直接用於正則
?>

5. rtrim() / ltrim() / trim() — 移除首尾字元

string rtrim(string $string, string $characters = " \t\n\r\0\x0B")
  • 移除字串**末端**連續出現的 `$characters` 中任意字元 (非子字串)。
  • 預設移除空白字元:空格、Tab、換行、回車、Null、垂直定位符。
  • 陷阱:`rtrim('abc', 'abc')` → `''` (因 a,b,c 皆在列表中,從尾端逐個移除)。**非移除子字串**,請用 `preg_replace('/abc$/', '', $str)`。
<?php
$path = '/var/www/html///';
echo rtrim($path, '/'); // /var/www/html

$str = "  hello world  ";
echo trim($str); // "hello world"
?>

6. chop() — rtrim() 別名 (不建議使用)

  • `chop()` 完全等同 `rtrim()`,但名稱易誤以為「切碎」。**官方建議直接用 `rtrim()`**。

7. get_html_translation_table() — 取得編碼對照表

<?php
$table = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, 'UTF-8');
print_r($table);
// ['&' => '&', '"' => '"', ...]
// 可用於自訂編碼邏輯或除錯
?>

8. strtr() — 字元/子字串翻譯 (高效能批次替換)

<?php
$trans = ['&' => '&', '<' => '<', '>' => '>'];
echo strtr($input, $trans); // 單次掃描完成多重替換,比 str_replace 陣列快
?>

安全性與最佳實踐總結

場景推薦函數組合關鍵點
使用者輸入輸出到 HTML`htmlspecialchars($input, ENT_QUOTES, 'UTF-8')`防 XSS 核心,指定編碼、雙引號單引號皆轉
純文字含換行輸出到 HTML`nl2br(htmlspecialchars($input, ENT_QUOTES, 'UTF-8'))`先編碼再換行,避免標籤破壞
動態建構正則`preg_quote($input, $delimiter)`轉義元字元+分隔符,比 quotemeta 完整
移除尾部特定字元 (如路徑 /)`rtrim($path, '/')`理解字元列表而非子字串語意
批次替換多組鍵值`strtr($str, $map)`單次掃描、不重複替換、效能優於 str_replace 陣列

熟練運用這組核心字串函數,並理解其編碼、語意與效能特性,是 PHP 開發者處理文字資料的基本功。

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