PHP 內建字串函數超過 100 個,沒人能全記住。關鍵是建立分類心智模型:需要時按類別查閱、對比選型。本文將常用函數按「定義、轉義、序列化、整理、格式化、分割、截取、長度、統計、查找、替換/處理」11 大類歸納,附帶實戰提示。
| 方式 | 語法 | 特性 | 適用場景 |
|---|---|---|---|
| 單引號 | 'hello $var' | 不解析變量、不轉義(除 \\ \'),速度最快 | 純靜態字串、大量輸出 |
| 雙引號 | "hello $var" | 解析變量、支援完整轉義序列 | 需插值的動態字串 |
| Heredoc | <<<EOF ... EOF | 行為同雙引號,適合多行大段文本(SQL、HTML 模板) | 嵌入大段文本、郵件模板 |
| Nowdoc | <<<'EOF' ... EOF | 行為同單引號,PHP 5.3+ | 不需解析的大段文本 |
💡 實戰提示: 索引陣列輸出調試時,{$arr[0]} 大括號語法在雙引號/Heredoc 中最清晰。
addslashes($str):預定義轉義 ' " \ NULL(資料庫入庫前常用,但不如參數化查詢安全);addcslashes($str, $charlist):自定義字符範圍轉義(如 '\0..\37!@');mysqli_real_escape_string()(僅限 MySQL)。serialize($mixed):將任意值(含物件)轉為可存儲字串;unserialize($str):還原(警惕非信任資料反序列化導致 RCE,PHP 7.0+ 支援 allowed_classes 選項)。替代方案: JSON(json_encode/decode)跨語言、可讀、安全性更高,優先考慮。
| 函數 | 作用範圍 | 移除字符(預設) |
|---|---|---|
trim($str, $charlist?) | 兩端 | 空格、\t、\n、\r、\0、\v |
ltrim() | 左端 | 同上 |
rtrim() | 右端 | 同上 |
💡 進階: 第二參數可指定自定義字符集合,如 trim($str, " \t\n\r\0\x0B")。
| 函數 | 功能 | 典型用例 |
|---|---|---|
nl2br($str) | \n → <br> | 前端顯示換行 |
wordwrap($str, $width, $break, $cut) | 按寬度換行 | 郵件正文、防止長單詞撐破版面 |
strtolower/strtoupper | 大小寫轉換 | 案件不敏感比較 |
ucfirst/ucwords | 首字母/每詞首字母大寫 | 姓名、標題格式化 |
explode($delimiter, $str, $limit?):按分隔符切分為陣列($limit > 0 限制返回數,< 0 返回除最後 |$limit| 個外的所有);implode($glue, $pieces) / join():陣列合併為字串;explode('', $str) 會報錯,分隔符不能為空;需逐字符分割用 str_split() 或 preg_split('//u', $str)。| 函數 | 參數 | 說明 |
|---|---|---|
substr($str, $start, $length?) | 起始位置、長度 | 負數表示從末尾倒數;多位元組字串會產生亂碼 |
mb_substr($str, $start, $length?, $encoding) | 同上 + 編碼 | 正確處理 UTF-8 等多位元組編碼,**生產環境必用** |
strlen($str):返回字節數,UTF-8 中一個漢字佔 3 字節;mb_strlen($str, $encoding):返回字符數,漢字計為 1。**涉及業務邏輯長度判斷必須用 mb_* 系列**。str_word_count($str, $format?, $charlist?):統計單詞數($format=1 返回單詞陣列,2 返回位置關聯陣列);array_count_values() 可得單詞頻次統計(簡易關鍵詞提取)。| 函數 | 返回值 | 大小寫 | 備註 |
|---|---|---|---|
strpos($haystack, $needle, $offset?) | 首次出現位置(整數)或 false | 敏感 | **必須用 === false 判斷**,0 也是有效位置 |
stripos() | 同上 | 不敏感 | 同上 |
strrpos() | 最後一次出現位置 | 敏感 | |
strstr($haystack, $needle, $before_needle?) | 從針開始/之前的子串 | 敏感 | $before_needle=true 返回針之前部分 |
stristr() | 同上 | 不敏感 | |
substr_count($haystack, $needle) | 出現次數 | 敏感 | 不支援重疊匹配 |
| 函數 | 功能 | 關鍵差異 |
|---|---|---|
str_replace($search, $replace, $subject, $count?) | 全量替換 | 支援陣列批量替換,$count 返回替換次數 |
substr_replace($str, $replacement, $start, $length?) | 按位置替換 | 可插入、刪除、替換指定區間 |
strrev($str) | 反轉字串 | 多位元組會亂碼,慎用 |
htmlspecialchars($str, $flags?, $encoding?) | < > & " ' → 實體 | **XSS 防禦首選**,預設不轉義單引號(需 ENT_QUOTES) |
htmlentities($str, $flags?, $encoding?) | 所有可轉實體字符皆轉換 | 更徹底,體積增大 |
strip_tags($str, $allowable_tags?) | 移除 HTML/PHP 標籤 | 第二參數保留允許標籤,**不可完全防 XSS** |
strcmp/strncmp/strcasecmp | 二進制/長度限制/不敏感比較 | 返回 <0, 0, >0 |
strtok($str, $token) | 順序分解 | 有狀態,多線程/遞迴慎用 |
strpbrk($str, $charlist) | 查找字符集合中任一字符首次出現 | 返回子串或 false |
strspn/strcspn | 字串開頭連續包含/不包含字符集合的長度 | 驗證格式(如純數字) |
建議將上表另存為 Markdown/Notion 頁面,遇到字串處理需求先查分類:
mb_* 系列;htmlspecialchars(..., ENT_QUOTES, 'UTF-8');str_replace 陣列模式;preg_* 系列(下篇詳解)。掌握分類與關鍵差異,比背誦百個函數參數更實用。