正則表達式被譽為「寫時只讀、神級強大、維護地獄」。本文提煉 PHP 正則的三大核心結構——分隔符、模式、修飾符——配合捕獲、替換、分割實戰,助你在 10 分鐘內建立正確心智模型,跨越入門恐懼。
/hello.+?hello/is
^ ^ ^ ^
| | | └─ 修飾符
| | └──── 模式
| └─────────── 結束分隔符
└────────────── 開始分隔符
/、#、~、@、%、| 等。/http:\/\// → 改用 #https://# 更清晰。'#pattern#'。a-z A-Z 0-9 等直接匹配自身。. ^ $ * + ? { } [ ] ( ) | \ 賦予特殊語義。[abc]、[a-z]、[^abc]、[:alpha:]、\d \w \s 等。(...) 捕獲,(?:...) 非捕獲,(?<name>...) 命名捕獲(PHP 5.2+)。a|b|c 任一匹配,優先級最低,常配合分組:(cat|dog)。| 修飾符 | 效果 | 必加場景 |
|---|---|---|
i | 不區分大小寫 | 關鍵字搜尋、Email 域名 |
m | 多行模式:^$ 匹配行首尾 | 多行文本逐行解析 |
s | 單行模式:. 匹配換行 | 跨行提取、HTML 內容 |
x | 忽略模式空白,支援 #註解 | 複雜正則可讀性 |
u | UTF-8 模式 | 處理中文/多位元組必加 |
U | 反轉貪婪 | 全局非貪婪偏好 |
D | $ 僅匹配字串絕對結尾 | 精確驗證結尾 |
J | 允許重複命名捕獲組 | 分支共用組名 |
// 只要判斷是否匹配
if (preg_match('/^[\w.-]+@[\w.-]+\.\w+$/', $email)) { /* valid */ }
// 需要提取部分
if (preg_match('/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/', $date, $m)) {
echo "Year: {$m['year']}, Month: {$m['month']}";
}
// 簡單替換
$clean = preg_replace('/\s+/', ' ', $dirty); // 多空白合併為單空格
// 回溯引用重構
$date = preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3/$2/$1', $date); // Y-m-d → d/m/Y
// 回調函數動態替換(避免巢狀、邏輯複雜)
$html = preg_replace_callback(
'/<img\s+src="([^"]+)"/i',
fn($m) => '
',
$html
);
// 分割單詞(保留標點)
$tokens = preg_split('/(\W)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
// 分割 CSV 行(處理引號內逗號)
$fields = preg_split('/,(?=(?:[^"]*"[^"]*")*[^"]*$)/', $line);
'\\d' → 正則見 \d;雙引號 "\\d" 同理。避免 '\d'(正則見 d)。. \ + * ? [ ] ^ $ ( ) { } | / # 需轉義匹配字面值。/^\d+$/ // 純數字
/^[\w.-]+@[\w.-]+\.\w+$/ // 簡易 Email
/^https?:\/\/\S+$/ // URL
/^[\p{Han}]{2,}$/u // 純中文 (u修飾符)
/\d{4}-\d{2}-\d{2}/ // 日期 Y-m-d
/\b\w{3,}\b/ // 3字母以上單詞
/<[^>]+>/ // HTML 標籤 (簡易)
strpos、str_replace、explode 快 10 倍以上。u 修飾符,否則字元截斷、位移錯誤、邊界失效。preg_quote,防注入與 ReDoS。正則是鋒利手術刀,非萬能鑰匙。掌握三部曲結構、三板斧操作、轉義鐵律、避坑三句經,即可安全驅馭 90% PHP 文字處理場景。