前言
字串處理是 Web 開發最高頻操作。PHP 提供豐富的內建函數,但命名不一、參數順序易混淆。本文分類整理實務高頻函數,附上參數說明與實戰範例,方便快速查閱。
一、分割與合併
| 函數 | 用途 | 範例 | 備註 |
implode($glue, $arr) | 陣列 → 字串 | implode(',', ['a','b']) → "a,b" | 別名 join |
explode($sep, $str, $limit) | 字串 → 陣列 | explode(',', 'a,b,c') → ['a','b','c'] | $limit > 0 限制筆數 |
str_split($str, $len) | 固定長度切割 | str_split('Hello', 2) → ['He','ll','o'] | |
preg_split($pattern, $str) | 正則分割 | preg_split('/[\s,;]+/', $str) | 功能最強 |
strtok($str, $tokens) | 依 token 逐段取出 | 首次傳 $str,後續傳 $tokens | 內部保持指標 |
http_build_query($arr) | 陣列 → URL 查詢字串 | ['a'=>1,'b'=>2] → "a=1&b=2" | 自動 urlencode |
二、搜尋與替換
| 函數 | 說明 | 回傳值 | 大小寫 |
strpos($haystack, $needle, $offset) | 首次出現位置 | int / false | 敏感 |
stripos | 同上 | int / false | 不敏感 |
strrpos / strripos | 最後出現位置 | int / false | 敏感/不敏感 |
strstr($haystack, $needle) | 從 needle 到結尾 | string / false | 敏感 |
stristr | 同上 | string / false | 不敏感 |
strchr / strrchr | 同 strstr/strrchr | string / false | 敏感 |
str_replace($s, $r, $subj, $count) | 全域替換 | string/array | 敏感 |
str_ireplace | 同上 | string/array | 不敏感 |
substr_replace($str, $repl, $start, $len) | 指定位置替換 | string | 敏感 |
strtr($str, $from, $to) | 字元對照替換 | string | 敏感 |
preg_replace($pat, $repl, $subj) | 正則替換 | string/array | 依 pattern |
preg_filter | 僅回傳有變更項 | array | 依 pattern |
strtr 進階用法
// 字元對照
echo strtr('abc', 'ab', 'xy'); // xyc
// 陣列對照 (長鍵優先)
$map = ['www' => 'ftp', 'yahoo' => 'baidu'];
echo strtr('www.yahoo.com', $map); // ftp.baidu.com
三、正則表達式 (PCRE)
// 單次匹配
if (preg_match('/php/i', 'PHP is great')) { echo '匹配'; }
// 全域匹配
preg_match_all('/\d+/', 'a1 b22 c333', $m);
// $m[0] = ['1','22','333']
// 替換並回傳次數
$cnt = preg_replace('/\s+/', '-', 'a b c', -1, $count);
// $cnt = 'a-b-c', $count = 2
// 轉義正則特殊字元
$safe = preg_quote('$40 for g3/400', '/'); // \$40 for g3\/400
常用 Pattern 速查
\d 數字、\w 單字字元、\s 空白
^ $ 行首行尾、\A \z 字串首尾
(?=...) (?!...) (?<=...) (? 前瞻/後顧斷言
x 修飾符:忽略 pattern 空白與註解,方便撰寫複雜 regex
四、URL 編碼與解析
| 函數 | 說明 | 差異 |
urlencode / urldecode | 應用程式層編碼 | 空格 → + |
rawurlencode / rawurldecode | RFC 3986 標準 | 空格 → %20,不處理 + |
parse_url($url) | 解析 URL 結構 | 回傳關聯陣列 |
parse_str($str, $arr) | 查詢字串 → 變數/陣列 | 第二參數建議傳陣列 |
五、日期時間處理
// 當前時間戳
$ts = time(); // int
// 格式化輸出
echo date('Y-m-d H:i:s', $ts);
echo date('c', $ts); // ISO 8601
// 建立特定時間
$ts = strtotime('2024-01-01 00:00:00');
$ts = mktime(0, 0, 0, 1, 1, 2024);
// DateTime 物件導向 (推薦)
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
$dt->modify('+1 day');
echo $dt->format('Y-m-d H:i:s');
// 計算差異
$diff = $dt1->diff($dt2);
echo $diff->days . ' 天';
echo $diff->format('%h 小時 %i 分鐘');
六、字串比較與相似度
| 函數 | 說明 | 回傳 |
strcmp($a, $b) | 二進位比較 | -1/0/1 |
strcasecmp | 不區分大小寫 | -1/0/1 |
strnatcmp / strnatcasecmp | 自然排序比較 | -1/0/1 |
similar_text($a, $b, $pct) | 相似字元數/百分比 | int / float |
soundex($str) | 發音編碼 (英文) | string |
metaphone($str) | 改良發音編碼 | string |
七、其他實用函數
// 填充
str_pad('5', 3, '0', STR_PAD_LEFT); // '005'
// 反轉
strrev('abc'); // 'cba'
// 字數統計 (英文)
str_word_count('Hello world', 1); // ['Hello', 'world']
// 子字串計數
substr_count('ababa', 'aba'); // 1 (不重疊)
// 取得副檔名
pathinfo('test.jpg', PATHINFO_EXTENSION); // 'jpg'
// 字元編碼轉換
iconv('UTF-8', 'BIG5//IGNORE', $str);
mb_convert_encoding($str, 'UTF-8', 'auto');
八、多位元組字串 (mbstring) 必知
- 所有
mb_* 函數需指定編碼或預設 mb_internal_encoding('UTF-8')。
- 常用:
mb_strlen, mb_substr, mb_strpos, mb_strtolower, mb_convert_case, mb_ereg_replace。
- 正則請用
mb_ereg_* 或 PCRE /u 修飾符。
結語
熟練掌握上述函數,能讓字串處理程式碼更簡潔、效能更佳。建議將本表設為編輯器 Snippet 或瀏覽器書籤,遇到字串操作先查手冊,避免重造輪子或踩坑。