| 修飾符 | 說明 |
i | 忽略大小寫 |
m | 多行模式:^/$ 匹配行首尾 |
s | 單行模式:. 匹配含換行 |
x | 擴展模式:忽略模式空白、允許註解 |
u | UTF-8 模式(處理中文必備) |
U | 非貪婪模式(量詞預設最小匹配) |
實戰範例
Email 驗證
<?php
$pattern = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
$emails = ['test@example.com', 'invalid@', 'user@domain.cn'];
foreach ($emails as $email) {
echo $email . ': ' . (preg_match($pattern, $email) ? '有效' : '無效') . "\n";
}
?>
HTML 標籤提取
<?php
$html = '';
preg_match_all('/<([a-z]+)[^>]*>(.*?)<\/\1>/is', $html, $matches);
print_r($matches[2]); // 內容
?>
中文分詞邊界
<?php
$text = "你好世界";
preg_match_all('/\p{Han}+/u', $text, $matches); // 需 u 修飾符
print_r($matches[0]); // ["你好", "世界"]
?>
替換與回呼
<?php
// 將數字加粗
echo preg_replace('/(\d+)/', '$1', '價格 123 元'); // 價格 123 元
// 回呼函數處理
echo preg_replace_callback('/(\d+)/', function($m) {
return $m[1] * 2;
}, '價格 123 元'); // 價格 246 元
?>
常用 preg_ 函數族
| 函數 | 用途 |
preg_match() | 匹配一次,回傳 0/1/false |
preg_match_all() | 全域匹配所有,回傳次數 |
preg_replace() | 搜尋替換 |
preg_replace_callback() | 回呼函數替換 |
preg_split() | 正則分割字串 |
preg_quote() | 跳脫正則特殊字元 |
preg_grep() | 過濾陣列元素 |
preg_last_error() | 取得最後錯誤代碼 |
效能與安全建議
- 避免災難性回溯:慎用
(.*)、(.+) 巢狀量詞,改用具體字元類別或非貪婪 .*?。
- 固定前綴模式效能最佳(如
/^prefix/)。
- 使用者輸入納入模式時,必須用
preg_quote() 跳脫。
- 複雜模式善用
x 修飾符加註解提升可讀性。
- 編譯緩存:相同模式重複使用時,PHP 會快取編譯結果。
線上測試工具
正則表達式功能強大但複雜,善用工具驗證、保持模式簡潔、優先考慮專用函數(如 filter_var 驗證 Email/URL),能事半功倍。
copyright ©
萬盛學電腦網 all rights reserved