首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 正則表達式 入門到進階完整教學 (PCRE)

     編輯:PHP 綜合知識

正則表達式 是文字處理的瑞士刀,PHP 採用 PCRE (Perl Compatible Regular Expressions) 引擎,功能強大且效能優異。本文從基礎語法、修飾符、進階斷言、實戰範例到效能優化,系統整理 PHP 正則完整知識體系。

一、基礎語法速查表

元字元說明範例
.任意單一字元 (除換行)a.c 匹配 abc, axc
\d數字 [0-9]\d{3} 三位數
\D非數字
\w單字字元 [a-zA-Z0-9_]
\W非單字字元
\s空白字元 [\t\n\r\f\v]
\S非空白字元
^字串開頭 (多行模式下為行首)
$字串結尾 (多行模式下為行尾)
|或運算cat|dog
()捕獲群組 (編號 1,2...)(\d{4})-(\d{2})
(?:)非捕獲群組(?:\d{3})?-
(?P)命名捕獲群組(?P\d{4})
[]字元類別[aeiou]
[^]排除字元類別[^0-9]
*0 次或多次 (貪婪)
+1 次或多次
?0 次或 1 次
{n,m}n 到 m 次\d{3,5}
*?, +?, ??惰性量詞 (最少匹配)

二、定界符與修飾符

$pattern = '/^https?:\/\/([\w.]+)\/([\w-]+)\.html$/i';
//   ^    定界符 (可用 / # ~ @ 等)
//                      i  忽略大小寫
//                      m  多行模式 (^$ 匹配行首尾)
//                      s  單行模式 (. 匹配換行)
//                      x  忽略模式中的空白/註解 (可讀性)
//                      u  UTF-8 模式 (正確處理中文)
//                      A  強制從字串開頭匹配
//                      D  $ 僅匹配字串絕對結尾
//                      U  反轉貪婪/惰性預設行為

建議: 含 / 時用 # 定界符;處理中文務必加 u 修飾符。

三、進階斷言 (零寬斷言 / Lookaround)

語法名稱方向條件範例
(?=...)正向前瞻向右後面必須匹配\d(?=px) 匹配後面是 px 的數字
(?!...)負向前瞻向右後面不可匹配\d(?!px) 匹配後面非 px 的數字
(?<=...)正向後瞻向左前面必須匹配(?<=\$)\d+ 匹配 $ 後的數字
(?負向後瞻向左前面不可匹配(? 匹配非 $ 開頭的數字

特性: 零寬度、不消耗字元、不捕獲、可嵌套。

四、常用函數對照

函數用途回傳值
preg_match()單次匹配int (0/1/false),$matches 參考捕獲
preg_match_all()全域匹配int 匹配次數,$matches 結構不同
preg_replace()搜尋替換字串/陣列,$limit 限制次數
preg_replace_callback()回調替換字串,回調函數處理複雜邏輯
preg_split()正則分割陣列,$limit, $flags
preg_quote()跳脫特殊字元字串,用於動態建構模式
preg_grep()陣列過濾陣列,返回匹配元素
preg_last_error()取得最後錯誤碼int (PREG_NO_ERROR 等)

五、實戰範例集

1. 驗證 Email (RFC 5322 簡化版)

$emailRegex = '/^[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($emailRegex, $email)) { /* valid */ }

2. 提取 URL 並解析域名

$text = '訪問 https://example.com/path 和 https://sub.test.org';
preg_match_all('#https?://(?P[\w.-]+)#', $text, $matches);
print_r($matches['domain']); // ['example.com', 'sub.test.org']

3. 密碼強度驗證 (至少 8 字、含大小寫、數字、特殊符號)

$pwdRegex = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/';
if (preg_match($pwdRegex, $pwd)) { /* strong */ }

4. HTML 標籤屬性提取 (非貪婪 + 斷言)

$html = 'Logo';
preg_match_all('/(\w+)="([^"]*)"/', $html, $m, PREG_SET_ORDER);
foreach ($m as $attr) { echo $attr[1] . '=' . $attr[2] . PHP_EOL; }

5. 中文分句 (標點斷句)

$text = '你好!這是測試。包含英文, 和數字123。';
$sentences = preg_split('/(?<=[。!?!?])/u', $text, -1, PREG_SPLIT_NO_EMPTY);

六、效能優化黃金法則

  1. 避免災難性回溯:(a+)+、(.*)* 遇到長字串會指數級爆炸 → 使用具體字元類別、限制量詞、原子群組 (?>...)。
  2. 善用錨點 ^$:縮小搜尋範圍,避免全字串掃描。
  3. 預編譯重用:同一模式多次使用時,存入靜態變數或常數,避免重複編譯。
  4. 優先用字串函數:strpos()、str_contains() (PHP 8)、substr() 效能遠優於正則。
  5. 限制回溯深度:ini_set('pcre.backtrack_limit', 100000); (預設 1M)。
  6. JIT 加速 (PHP 7.3+):ini_set('pcre.jit', 1); 開啟即時編譯。

七、常見錯誤與除錯

Delimiter must not be alphanumeric or backslash
定界符選擇錯誤,必須是非字母數字、非反斜線、非空白字元。
Compilation failed: missing ) at offset...
括號不匹配、字元類別 [] 未閉合。
Unknown modifier 'x'
模式結尾修飾符拼錯、定界符未閉合導致後續字元被誤判為修飾符。
preg_match() returns false
檢查 preg_last_error(),常見為 PREG_BACKTRACK_LIMIT_ERROR (回溯過深) 或 PREG_RECURSION_LIMIT_ERROR。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved