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

正則表達式語法大全與運算符優先級權威指南

     編輯:PHP 綜合知識

正則表達式是一門「模式描述語言」,擁有完整的語法體系與運算符優先級。本文提供 PCRE (PHP/JS/Java 通用) 完整元字符速查表、運算符優先級表、常用模式模板,作為開發時的桌面參考手冊。

完整元字符速查表

字符說明示例
\轉義符,標記下一字符為特殊/字面/後向引用/八進制\n 換行,\\ 反斜杠,\( 左括號
^字符串/行 首 (多行模式)^abc
$字符串/行 尾 (多行模式)abc$
*前面子表達式 0~∞ 次zo* 匹配 z, zo, zoo
+前面子表達式 1~∞ 次zo+ 匹配 zo, zoo
?前面子表達式 0~1 次do(es)? 匹配 do, does
{n}固定 n 次o{2} 匹配 food 中的 oo
{n,}至少 n 次o{2,} 匹配 foooood 所有 o
{n,m}n 到 m 次o{1,3} 匹配前 3 個 o
? (量詞後)惰性/非貪婪模式o+? 匹配單個 o
.除換行外任意字符 (s 修飾符含換行)a.c 匹配 aac, abc, a-c
(pattern)捕獲分組,可後向引用(abc)\1 匹配 abcabc
(?:pattern)非捕獲分組industr(?:y|ies)
(?=pattern)正向前瞻 (零寬斷言)Windows(?=95|98)
(?!pattern)負向前瞻Windows(?!95|98)
(?<=pattern)正向後顧 (固定寬度)(?<=\$)\d+
(?<!pattern)負向後顧(?<!\$)\d+
x|y選擇分支cat|dog
[xyz]字符集合[abc] 匹配 a
[^xyz]否定字符集合[^abc] 匹配 p
[a-z]字符範圍[a-z] 小寫字母
[^a-z]否定字符範圍[^a-z] 非小寫
\b單詞邊界er\b 匹配 never 中的 er
\B非單詞邊界er\B 匹配 verb 中的 er
\cx控制字符\cM 回車
\d數字 [0-9]-
\D非數字 [^0-9]-
\f換頁-
\n換行-
\r回車-
\s空白 [\f\n\r\t\v]-
\S非空白 [^\f\n\r\t\v]-
\t製表-
\v垂直製表-
\w單詞字符 [A-Za-z0-9_]-
\W非單詞字符 [^A-Za-z0-9_]-
\xHH十六進制 (2位)\x41 = A
\num後向引用 (捕獲組編號)(.)\1 連續相同字符
\n (八進制)八進制轉義/後向引用 (視上下文)\11 = Tab
\nm八進制/後向引用-
\nml八進制 (n=0-3, m,l=0-7)\011 = Tab
\uHHHHUnicode 字符 (4位十六進制)\u00A9 = ©

運算符優先級 (高 → 低)

優先級運算符結合性說明
1 (最高)\右轉義符
2() (?:) (?=) (?!) []左分組、斷言、字符類別
3* + ? {n} {n,} {n,m}左限定符 (量詞)
4^ $ \元字符左定位符、序列
5 (最低)|左選擇分支 (或)

優先級實例解析

# 1. 量詞 > 選擇
ab*|cd   # 等價於 (ab*)|(cd)  而非 a(b*|c)d

# 2. 分組改變優先級
a(b|c)*  # a 後跟 0 或多個 b 或 c
(a|b)c*  # a 或 b,後跟 0 或多個 c

# 3. 定位符範圍
^abc$    # 整行匹配 abc
^abc|def$ # (^abc) | (def$)  首行 abc 或 尾行 def
^(abc|def)$ # 整行匹配 abc 或 def

常用模式模板庫

<?php
$patterns = [
    // 基礎驗證
    'non_empty'      => '/\S/',
    'whitespace'     => '/^\s*$/',
    'alphanumeric'   => '/^[A-Za-z0-9]+$/',
    'alpha_space'    => '/^[A-Za-z\s]+$/',
    
    // 數字格式
    'integer'        => '/^[+-]?\d+$/',
    'float'          => '/^[+-]?\d*\.?\d+$/',
    'price'          => '/^\d+(\.\d{1,2})?$/',
    'percentage'     => '/^\d+(\.\d+)?%?$/',
    
    // 日期時間 (格式驗證,不驗證邏輯有效性)
    'date_ymd'       => '/^\d{4}-\d{2}-\d{2}$/',
    'datetime'       => '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/',
    'time_hms'       => '/^\d{2}:\d{2}:\d{2}$/',
    
    // 網絡
    'ipv4'           => '/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/',
    'mac'            => '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/',
    'domain'         => '/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/',
    'url'            => '/^https?:\/\/(?:[^\s\/$.?#].[^\s]*)/i',
    
    // 身份證明
    'email'          => '/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/',
    'id_card_cn'     => '/^[1-9]\d{5}(?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/',
    'mobile_cn'      => '/^1[3-9]\d{9}$/',
    'plate_cn'       => '/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}$/',
    
    // 編程相關
    'variable'       => '/^[A-Za-z_][A-Za-z0-9_]*$/',
    'hex_color'      => '/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/',
    'uuid'           => '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i',
    'json_brace'     => '/^\s*[\{\[].*[\}\]]\s*$/s',
    
    // 安全檢測
    'sql_injection'  => '/(union|select|insert|update|delete|drop|alter|create)\s+/i',
    'xss_script'     => '/<script\b[^>]*>.*?<\/script>/is',
    'path_traversal' => '/\.\.[\/\\\\]/',
];

// 使用示例
function check($name, $input) {
    global $patterns;
    $ok = (bool)preg_match($patterns[$name], $input);
    echo "[$name] '$input' => " . ($ok ? '✓' : '✗') . "\n";
}

check('email', 'test@example.com');
check('mobile_cn', '13800138000');
check('id_card_cn', '11010119900307123X');
check('uuid', '550e8400-e29b-41d4-a716-446655440000');
check('hex_color', '#ff0000');
check('path_traversal', '../../etc/passwd');

修飾符 (Flags) 速查

修飾符名稱效果PHP 常量
i忽略大小寫大小寫不敏感匹配PCRE_CASELESS
m多行模式^ $ 匹配行首尾PCRE_MULTILINE
s單行模式 (DOTALL). 匹配含換行PCRE_DOTALL
x擴展模式忽略模式空白、允許註釋 #PCRE_EXTENDED
uUTF-8 模式正確處理 Unicode,支援 \p{}PCRE_UTF8
U非貪婪模式反轉量詞貪婪性PCRE_UNGREEDY
A強制錨定強制從字符串開頭匹配PCRE_ANCHORED
D美元優化$ 僅匹配字符串絕對結尾PCRE_DOLLAR_ENDONLY
J重複命名組允許同名命名捕獲組PCRE_DUPNAMES

總結

正則語法雖繁,但核心在於:轉義 > 分組/斷言/類別 > 量詞 > 定位/序列 > 選擇。熟練掌握優先級、善用分組控制範圍、靈活切換貪婪/惰性、根據場景選擇修飾符,是編寫高性能、可維護模式的關鍵。建議收藏本文作為開發速查手冊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved