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

PHP 正則表達式 (PCRE) 完整指南:語法、修飾符、常用函式與實戰範例

     編輯:PHP 相關知識

正則表達式在 PHP 中的地位

PHP 提供兩套正則函式:PCRE (preg_*) 與 POSIX (ereg_*)。POSIX 自 PHP 5.3 棄用、PHP 7 移除,現代開發一律使用 PCRE(Perl 相容正則表達式),語法強大且效能優異。

PCRE 模式定界符與基本語法

模式須包裹於定界符,慣用 `/pattern/` 或 `#pattern#`、`~pattern~`。元字符、量詞、字元類別、分組、斷言等語法與 Perl 一致。

常用元字元速查表

元字元說明
\A字串開頭(不受多行模式影響)
\Z字串結尾(不受多行模式影響)
\b單詞邊界
\B非單詞邊界
\d數字 `[0-9]`
\D非數字 `[^0-9]`
\w字母數字底線 `[0-9a-zA-Z_]`
\W非字母數字底線
\s空白字元 `[ \t\n\r\f\v]`
\S非空白字元
.任意字元(預設不含換行,`s` 修飾符含換行)
^行首(`m` 修飾符啟用多行模式)
$行尾(`m` 修飾符啟用多行模式)

模式修飾符

修飾符名稱效果
iPCRE_CASELESS大小寫不敏感
mPCRE_MULTILINE`^$` 匹配行首行尾
sPCRE_DOTALL`.` 匹配含換行
xPCRE_EXTENDED忽略模式中的空白與註釋
UPCRE_UNGREEDY量詞預設非貪婪
uPCRE_UTF8UTF-8 模式(處理中文必加)
ePREG_REPLACE_EVAL已移除 (PHP 7),勿使用

核心函式速查

函式用途回傳值
preg_match匹配一次`1`/`0`/`false`,第三參數捕獲結果
preg_match_all全域匹配匹配次數,第三參數捕獲所有結果
preg_replace搜尋替換新字串,或陣列
preg_replace_callback回調替換新字串
preg_split正則分割陣列
preg_grep陣列過濾匹配的陣列元素
preg_quote跳脫特殊字元安全字串

進階技巧:斷言與回調

1. 預瞻/回顧斷言(零寬度斷言)

// 匹配 action="..." 但排除 http: 開頭
preg_match_all('/(?<=action=")(?!http:)(.*?)(?="\s)/', $html, $m);

// 匹配無屬性 HTML 標籤內容 text
preg_match_all('/(?<=<(\w+)>).*?(?=<\/\1>)/', $str, $m);

2. 替換回調:動態計算替換值

$url = 'https://example.com';
$html = preg_replace_callback(
    '/(?<=action="|src="|href=")(?!http:|javascript)(.*?)(?="\s)/',
    function($m) use ($url) { return $url . '/' . $m[1]; },
    $html
);

3. 非捕獲群組 `(?:...)`

// 僅需引用第 2 組
/(?:a|b|c)(D|E|F)\2g/  // 匹配 aEEg, bFFg 等

實用常用正則範例庫

// Email (簡易)
/^[\w.+-]+@[\w-]+\.[\w.-]+$/

// URL
/^https?:\/\/[\w.-]+\.[a-z]{2,}(\/\S*)?$/i

// 手機號 (台灣)
/^09\d{8}$/

// 統一編號 (台灣)
/^\d{8}$/

// 日期 YYYY-MM-DD
/^\d{4}-\d{2}-\d{2}$/

// IPv4
/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/

// HTML 標籤 (簡易)
/<[^>]+>/

// 去除 HTML 標籤
$text = preg_replace('/<[^>]+>/', '', $html);

效能與最佳實踐

  • 能用字串函式解決就不用正則:`strpos`、`substr`、`explode` 效能遠高於正則。
  • 編譯緩存:同一模式重複使用時,PHP 內部會緩存編譯結果,但動態生成模式會重複編譯。
  • 避免災難性回溯:嵌套量詞 `(a+)+`、模糊匹配 `.*` 遇長字串極慢,改用具體字元類別或佔有優先量詞 `*+` `++`。
  • 中文處理必加 `u` 修飾符:否則 `.`、`\w` 等按位元組匹配,導致亂碼或錯誤。
  • 工具推薦:regex101.com 即時測試、解釋、生成代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved