| 旗標 | 說明 |
PREG_SPLIT_NO_EMPTY | 忽略空字串結果 |
PREG_SPLIT_DELIM_CAPTURE | 捕獲分隔符 (括號群組) |
PREG_SPLIT_OFFSET_CAPTURE | 結果包含位移 |
範例:保留分隔符分割
preg_split('/(\s+)/', "a b\tc", -1, PREG_SPLIT_DELIM_CAPTURE);
// ["a", " ", "b", "\t", "c"]
錯誤處理與除錯
$result = preg_match($pattern, $subject);
if ($result === false) {
$error = preg_last_error();
$messages = [
PREG_INTERNAL_ERROR => 'PCRE 內部錯誤',
PREG_BACKTRACK_LIMIT_ERROR => '回溯限制超過',
PREG_RECURSION_LIMIT_ERROR => '遞迴限制超過',
PREG_BAD_UTF8_ERROR => '無效 UTF-8 序列',
PREG_BAD_UTF8_OFFSET_ERROR => 'UTF-8 位移無效',
];
throw new Exception($messages[$error] ?? "未知錯誤: $error");
}
效能優化最佳實務
- 使用具體字元類別:
[a-z] 優於 .
- 避免過度回溯:
(.*) 在長字串極慢,改用 (.*?) 或 [^"]*
- 錨定模式:開頭加
^、結尾加 $ 減少嘗試位置
- 預編譯重用:相同模式重複使用時,PHP 內部快取已編譯模式
- 限制匹配次數:
preg_match_all($pattern, $subject, $matches, 0, $offset) 指定起始位置
- 啟用 JIT:PHP 7.3+ PCRE 編譯時支援 JIT,大幅加速重複執行
實戰範例集
1. Email 驗證 (RFC 5322 簡化版)
$emailPattern = '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/';
if (preg_match($emailPattern, $email)) { /* valid */ }
2. HTML 標籤屬性提取
preg_match_all('/<img\s+[^>]*src\s*=\s*["\']([^"\']+)["\']/i', $html, $matches);
$imageUrls = $matches[1];
3. 千分位格式化數字
preg_replace('/(\d)(?=(\d{3})+(?!\d))/', '$1,', $number);
4. 移除 HTML 標籤保留文字
preg_replace('/<[^>]+>/', '', $html);
PCRE 版本資訊
echo PCRE_VERSION; // 例:10.42 2022-12-11
總結
PCRE 是 PHP 字串處理的核心利器,掌握其函數族、修飾符、進階斷言、效能技巧,能解決 90% 以上的文字解析需求。記住:複雜解析優先考慮專用解析器 (HTML 用 DOMDocument, JSON 用 json_decode),正則用於結構相對固定的模式匹配。
- 上一篇文章: No
- 下一篇文章: PHP RESTful API 實戰教學:從零建立符合 REST 架構的 Web 服務
Copyright ©
程式碼之家 All Rights Reserved