核心結論
split() 已在 PHP 7.0 移除**,**explode() 是標準替代品**,**preg_split() 是正則切割的現代選擇**。請勿在新專案使用 split()。
函式簽名對比
| 特性 | explode() | split() (已移除) | preg_split() |
| PHP 版本 | 全版本 | PHP 4/5,**PHP 7.0 移除** | PHP 4+ (PCRE) |
| 分隔符類型 | **固定字串** | **正則表達式** | **PCRE 正則** |
| 效能 | **極快** (C 級字串搜尋) | 較慢 (正則引擎) | 中等 (PCRE 優化) |
| 限制參數 | limit (正/負/零) | limit | limit |
| 旗標參數 | 無 | 無 | PREG_SPLIT_* 旗標 |
| 空分隔符行為 | Warning + 回傳 false | 正則 // 匹配每字元 | PREG_SPLIT_NO_EMPTY 可過濾 |
explode() 完整用法
<?php
// 基本用法
$str = "apple,banana,orange,grape";
$arr = explode(',', $str);
// ['apple', 'banana', 'orange', 'grape']
// limit 參數
explode(',', 'a,b,c', 2); // ['a', 'b,c'] 正數:最多 N 元素,最後元素含剩餘
explode(',', 'a,b,c', -1); // ['a', 'b'] 負數:排除最後 N 個元素 (PHP 5.1+)
explode(',', 'a,b,c', 0); // ['a', 'b', 'c'] 零:同正數 1 (PHP 8.0+ 棄用)
// 空分隔符
explode('', 'abc'); // Warning: Empty delimiter, 回傳 false
// 多字元分隔符
explode('::', 'a::b::c'); // ['a', 'b', 'c']
preg_split() 現代正則切割(替代 split())
<?php
// 多種分隔符:逗號、分號、空白
$str = "apple, banana;orange grape";
$arr = preg_split('/[,;\s]+/', $str);
// ['apple', 'banana', 'orange', 'grape']
// 保留分隔符 (PREG_SPLIT_DELIM_CAPTURE)
preg_split('/([,;])/', 'a,b;c', -1, PREG_SPLIT_DELIM_CAPTURE);
// ['a', ',', 'b', ';', 'c']
// 移除空元素 (PREG_SPLIT_NO_EMPTY)
preg_split('/\s+/', "a b c", -1, PREG_SPLIT_NO_EMPTY);
// ['a', 'b', 'c']
// 獲取偏移位置 (PREG_SPLIT_OFFSET_CAPTURE)
preg_split('/ /', 'a b c', -1, PREG_SPLIT_OFFSET_CAPTURE);
// [['a',0], ['b',2], ['c',4]]
split() 歷史遺留代碼遷移指南
| 舊 split() 寫法 | 新 explode() / preg_split() 寫法 | 說明 |
split(':', $str) | explode(':', $str) | 固定字串分隔 → explode |
split('[/.-]', $date) | preg_split('/[\/.-]/', $date) | 字元類別正則 → preg_split |
split('\\\\', $path) | explode('\\', $path) 或 preg_split('/\\\\/', $path) | 反斜線需雙重轉義 |
split('\|', $str) | explode('|', $str) 或 preg_split('/\|/', $str) | 管道符正則需轉義 |
效能實測(100 萬字串、平均 20 字元、單字元分隔)
| 函式 | 耗時 (ms) | 相對速度 | 記憶體 |
explode(',', $str) | ~45 | **1.0x (基準)** | ~12 MB |
preg_split('/,/', $str) | ~180 | 0.25x | ~18 MB |
split(',', $str) (PHP 5.6) | ~210 | 0.21x | ~20 MB |
**結論**:固定分隔符 **explode() 快 4-5 倍**;需正則才用 preg_split()。
常見陷阱與解決方案
- CSV 解析勿用 explode:欄位含逗號/引號/換行會錯誤。
→ 使用 str_getcsv() 或 fgetcsv() (RFC 4180 標準)。
- 空字串分隔:
explode('', $str) 報錯。
→ 單字元拆分用 str_split($str) 或 preg_split('//u', $str) (UTF-8 安全)。
- 多行字串分隔:
explode("\n", $str) 不處理 \r\n。
→ preg_split('/\r\n|\r|\n/', $str) 或 preg_split('/\R/', $str) (PHP 7.4+ \R 通用換行)。
- Unicode 字元邊界:
explode 按位元組切割,會破壞多位元組字元。
→ preg_split('//u', $str) 或 mb_split() (需 mbstring)。
總結建議
- **固定字串分隔** → explode()(最快、最簡單、無依賴)。
- **正則分隔 / 多種分隔符 / 進階控制** → preg_split()(PCRE 功能完整、效能可接受)。
- **CSV/TSV 結構化資料** → str_getcsv() / fgetcsv()。
- **移除所有 split() 呼叫**,升級至 PHP 7+ 時必須重構。