字串處理是 PHP 開發最高頻操作。本文系統整理核心字串函數,按功能分類提供語法、參數說明、常見陷阱與最佳實踐範例,作為開發時的快速查閱手冊。
| 方式 | 語法 | 說明 | 效能 |
|---|---|---|---|
| 點號運算子 | $a . $b | 基本拼接 | 標準 |
| 點號賦值 | $a .= $b | 原地追加,迴圈中拼接大字串**必須用此法**,避免重複複製 | 高 |
| 雙引號插值 | "{$a} {$b}" | 可讀性佳,支援變數、陣列元素、物件屬性插值 | 略低於點號 |
sprintf | sprintf('%s-%s', $a, $b) | 格式化拼接,適合固定模板 | 中 |
implode/join | implode(',', $arr) | 陣列合併為字串,大量片段拼接首選 | 高 |
大字串拼接禁忌:迴圈中 `$str = $str . $part` 會導致 O(N²) 記憶體複製。正確:`$parts[] = $part; ... $str = implode('', $parts);` 或 `$str .= $part;`。
// 簡單替換 (區分大小寫)
str_replace($search, $replace, $subject, $count = null);
// 正則替換 (強大、複雜)
preg_replace($pattern, $replacement, $subject, $limit = -1, $count = null);
// 多字節安全替換 (需 mbstring)
mb_ereg_replace($pattern, $replacement, $string, $option = 'msr');
// 截取替換 (指定位置、長度)
substr_replace($string, $replacement, $offset, $length = null);
// $offset: 正數從開頭、負數從結尾、0 從開頭
// $length: 正數替換長度、負數保留結尾長度、0 為插入不替換
// 位元組長度 (非字元數)
strlen($string);
// 多字節字元長度 (UTF-8 中文每字 3-4 bytes)
mb_strlen($string, 'UTF-8');
// 子字串出現次數
substr_count($haystack, $needle, $offset = 0, $length = null);
// 單詞計數 (支援格式化輸出)
str_word_count($string, $format = 0, $charlist = null);
// format: 0=數量, 1=單詞陣列, 2=關聯陣列(位置=>單詞)
| 函數 | 大小寫 | 回傳值 | 多字節版 |
|---|---|---|---|
strpos | 敏感 | 首次出現位置 (int) 或 false | mb_strpos |
stripos | 不敏感 | 首次出現位置 (int) 或 false | mb_stripos |
strrpos | 敏感 | 最後出現位置 | mb_strrpos |
strripos | 不敏感 | 最後出現位置 | mb_strripos |
strstr | 敏感 | 從首次出現處到結尾的子字串 | mb_strstr |
stristr | 不敏感 | 從首次出現處到結尾的子字串 | mb_stristr |
嚴格比較:if (strpos($haystack, $needle) !== false)(0 也是有效位置,不可用if (strpos(...)))。
// 區分大小寫
strcmp($str1, $str2); // 0=相等, <0 str1較小, >0 str1較大
strncmp($str1, $str2, $len); // 比較前 $len 字元
// 不區分大小寫
strcasecmp($str1, $str2);
strncasecmp($str1, $str2, $len);
// 自然排序比較 (人類直覺: "img2" < "img10")
strnatcmp($str1, $str2);
strnatcasecmp($str1, $str2); // 不區分大小寫
// 當地語系感知比較 (需 intl 擴展)
\Collator::create('zh_TW')->compare($str1, $str2);
str_repeat($input, $multiplier); // 重複 $multiplier 次
strrev($string); // 反轉字串 (注意多字節會亂碼,需 mb_str_split 反轉陣列再 implode)
// 依分隔符分割 (支援正則: preg_split)
explode($delimiter, $string, $limit = PHP_INT_MAX);
// $limit > 0: 最多回傳 $limit 個元素
// $limit < 0: 回傳總數 - |$limit| 個元素
// $limit = 0: 視為 1
// 固定長度分割
str_split($string, $length = 1); // 回傳字元陣列
// 多字節安全分割
mb_str_split($string, $length = 1, 'UTF-8'); // PHP 7.4+
// 正則分割 (彈性)
preg_split($pattern, $string, $limit = -1, $flags = 0);
// flags: PREG_SPLIT_NO_EMPTY, PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE
implode($glue = '', $pieces); // $glue 預設空字串,建議顯式傳入
join($glue, $pieces); // implode 別名
strtolower($string); // 全部小寫
strtoupper($string); // 全部大寫
ucfirst($string); // 首字元大寫
ucwords($string); // 每個單詞首字元大寫
// 多字節版
mb_strtolower($string, 'UTF-8');
mb_strtoupper($string, 'UTF-8');
mb_convert_case($string, MB_CASE_TITLE, 'UTF-8'); // 標題大寫 (ucwords 多字節版)
// 輸出格式化
printf($format, ...$args); // 直接輸出
sprintf($format, ...$args); // 回傳字串
vprintf($format, $args); // 陣列參數
vsprintf($format, $args); // 陣列參數回傳字串
// HTML 實體編碼 (防 XSS 必用)
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
htmlentities($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8');
// URL 編碼
urlencode($string); // 空格變 +, 適用 application/x-www-form-urlencoded
rawurlencode($string); // 空格變 %20, 符合 RFC 3986, 適用 URL 路徑
// 解碼
urldecode($string);
rawurldecode($string);
// 移除標籤
strip_tags($string, $allowable_tags = '');
// 去除首尾空白 (含 \n\r\t\v\0)
trim($string, $characters = " \n\r\t\v\0");
ltrim($string); rtrim($string);
// 字元集轉換 (需 iconv/mbstring)
iconv('UTF-8', 'GBK//IGNORE', $string);
mb_convert_encoding($string, 'UTF-8', 'auto'); // 自動偵測來源編碼
// 產生隨機字串 (Token, 檔名)
bin2hex(random_bytes(16)); // 32 字元十六進位
base64_encode(random_bytes(24)); // URL-safe 需 strtr($s, '+/', '-_')
// 截斷字串並加省略號 (多字節安全)
function truncate(string $str, int $len, string $suffix = '...'): string {
if (mb_strlen($str) <= $len) return $str;
return mb_substr($str, 0, $len - mb_strlen($suffix)) . $suffix;
}
// 移除 Emoji (儲存至不支援 utf8mb4 的舊資料庫)
$clean = preg_replace('/[\xF0-\xF7][\x80-\xBF]{3}/', '', $utf8String); // 簡易移除 4-byte UTF-8
// 或用資料庫 utf8mb4 字元集 (推薦)
掌握字串函數分類、多字節陷阱、效能差異 (implode vs 迴圈拼接)、安全編碼 (htmlspecialchars, rawurlencode),能寫出正確、高效、安全的 PHP 代碼。實務上**統一使用 UTF-8 + mbstring 函數 + 準備語句**,可避開 90% 字串相關坑。