前言
正則表達式是文字處理的瑞士刀。本文整理了 PHP 開發中最高頻的正則模式,涵蓋資料驗證、資訊提取、元字符語法三大維度,並修正了網路上流傳版本中的轉義錯誤與重複條目。
一、資料格式驗證類
數值驗證
| 名稱 | 模式 | 說明 |
| 非負整數 | ^\d+$ | 正整數 + 0 |
| 正整數 | ^[1-9]\d*$ | 不含前導零 |
| 非正整數 | ^(-\d+|0+)$ | 負整數 + 0 |
| 負整數 | ^-[1-9]\d*$ | 嚴格負整數 |
| 整數 | ^-?\d+$ | 含正負號 |
| 非負浮點數 | ^\d+(\.\d+)?$ | 正浮點數 + 0 |
| 正浮點數 | ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.\d+)|([1-9]\d*))$ | 嚴格 > 0 |
| 浮點數 | ^-?\d+(\.\d+)?$ | 通用浮點數 |
字串格式驗證
| 名稱 | 模式 | 適用場景 |
| 純英文字母 | ^[A-Za-z]+$ | 用戶名、標籤 |
| 英文大寫 | ^[A-Z]+$ | 縮寫代碼 |
| 英文小寫 | ^[a-z]+$ | slug、路徑 |
| 英數混合 | ^[A-Za-z0-9]+$ | ID、Token |
| 英數下劃線 | ^\w+$ | 變數名、鍵名 |
| Email 地址 | ^[\w.-]+@[\w-]+(\.[\w-]+)+$ | 表單驗證 |
| URL | ^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ | 連結驗證 |
| 日期 (YYYY-MM-DD) | ^(\d{4}|\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ | 表單日期 |
| IPv4 地址 | ^((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$ | IP 白名單 |
| 國內手機號 | ^1[3-9]\d{9}$ | 中國大陸手機 |
| 身份證號 (18位) | ^\d{17}[\dXx]$ | 實名認證 |
| 郵政編碼 | ^[1-9]\d{5}$ | 地址表單 |
| 中文字符 | ^[\x{4e00}-\x{9fa5}]+$ | 需 u 修飾符 |
| 車牌號 (新能源) | ^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[DF]$ | 車輛管理 |
二、資訊提取類
適用於 preg_match_all() 從非結構化文本中擷取結構化資料:
| 目標 | 模式 | 範例輸入 |
| 中文字符 | [\x{4e00}-\x{9fa5}] | 提取純中文 |
| 雙位元組字符 | [^\x00-\xff] | 含中日韓字符 |
| Email | \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* | 郵件收集 |
| URL | https?://[\w.-]+(?:\.[\w.-]+)+[\w\-._~:/?#[\]@!$&'()*+,;=]* | 連結提取 |
| HTML 標籤 | <([^>]+)>(.*?)\1>|<[^>]+/> | 標籤解析 |
| 圖片連結 | (src|href)=["']?([^"'>\s]+\.(?:jpg|jpeg|png|gif|webp))["']? | 圖片爬蟲 |
| IPv4 | \b(\d{1,3}\.){3}\d{1,3}\b | 日誌分析 |
| 手機號 | (? | 隱私脫敏 |
| 浮點數 | -?\d*\.\d+ | 價格提取 |
| QQ 號 | [1-9]\d{4,10} | 社交資料 |
三、元字符與語法速查
定位符
^:字串開始 (多行模式下為行首)
$:字串結束 (多行模式下為行尾)
\b:單字邊界
\B:非單字邊界
量詞
| 符號 | 含義 | 貪婪/懶惰 |
* | 0 次或多次 | 貪婪 (*? 懶惰) |
+ | 1 次或多次 | 貪婪 (+? 懶惰) |
? | 0 次或 1 次 | 貪婪 (?? 懶惰) |
{n} | 恰好 n 次 | — |
{n,} | 至少 n 次 | 貪婪 |
{n,m} | n 到 m 次 | 貪婪 |
字符類別
\d = [0-9] 數字
\D = [^0-9] 非數字
\w = [A-Za-z0-9_] 單字字符
\W = [^A-Za-z0-9_] 非單字字符
\s = [ \f\n\r\t\v] 空白字符
\S = [^ \f\n\r\t\v] 非空白字符
分組與斷言
(pattern):捕獲分組
(?:pattern):非捕獲分組
(?=pattern):正向前瞻 (零寬斷言)
(?!pattern):負向前瞻
(?<=pattern):正向後顧 (固定寬度)
(?:負向後顧
四、PHP 實戰最佳實踐
修飾符選擇
$pattern = '/^[\x{4e00}-\x{9fa5}]+$/u'; // u: UTF-8 模式,支援 Unicode 屬性
$pattern = '/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/i'; // i: 忽略大小寫
$pattern = '/^.*$/s'; // s: . 匹配換行符
$pattern = '/^$/m'; // m: 多行模式,^$ 匹配行首尾
常見陷阱與修正
| 錯誤寫法 | 問題 | 正確寫法 |
"/d+" | 雙引號吞噬反斜線 | '/\d+/' 或 "/\\d+"/ |
'.' | 匹配任意字符而非點號 | '\.' 或 '[.]' |
'^.*$' | 預設不匹配換行 | '/^.*$/s' 或 '/^[\s\S]*$/' |
'[\u4e00-\u9fa5]' | PHP 不支援 \u 轉義 | '/[\x{4e00}-\x{9fa5}]/u' |
效能優化原則
- 優先使用具體字符類別而非
. (如 \d 代替 . 匹配數字)
- 避免嵌套量詞:
(a+)* 易導致災難性回溯
- 善用錨點
^ $ 縮小搜尋範圍
- 長文本提取使用
preg_match_all() 而非循環 preg_match()
- 編譯緩存:PHP 會自動緩存最近使用的模式,重複使用同一模式無額外開銷
五、表單輸入限制 (前端輔助)
注意:前端限制僅為用戶體驗,後端必須二次驗證。
<!-- 僅中文 -->
<input oninput="value=value.replace(/[^\u4e00-\u9fa5]/g,'')">
<!-- 僅數字 -->
<input oninput="value=value.replace(/\D/g,'')">
<!-- 數字與英文 -->
<input oninput="value=value.replace(/[^\w]/g,'')">
<!-- 手機號格式 -->
<input pattern="^1[3-9]\d{9}$" title="請輸入正確手機號">
結語
正則表達式功能強大但易寫難維護。建立專案級正則庫、編寫單元測試覆蓋邊界案例、複雜解析改用專用 Parser (如 HTML 用 DOMDocument),是長期可維護的最佳策略。
- 上一篇文章: PHP GD 庫繪製正弦餘弦曲線:動態圖像生成實戰
- 下一篇文章: PHP 計數器實現方案:從文字檔到資料庫的完整演進
Copyright ©
程式碼之家 All Rights Reserved