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

PHP 正則匹配實戰:從基礎模式到 Email、URL、HTML、日誌提取的完整遷移指南

     編輯:PHP 相關知識

正則匹配是文字處理的瑞士軍刀。本文以「模式 → 解析 → 實戰」三層結構,系統講解基礎錨點、字元類別、量詞、分組、修飾符的組合邏輯,並給出 Email、URL、HTML 標籤、日誌、CSV、日期等高頻場景的生產級模式與 PHP 代碼範例。

核心模式構建塊速查

元素語法作用
錨點^ $ \A \Z \z \b \B定位位置,不消耗字元
字元類別[abc] [a-z] [^abc] [:alpha:] \p{Han} \d \w \s匹配字元集合
量詞* + ? {m,n} *? +? ?? {m,n}? *+ ++ ?+ {m,n}+控制重複次數與模式
分組(...) (?:...) (?<name>...) (?=...) (?<=...) (?>...)捕獲、非捕獲、命名、斷言、原子
或運算a|b|c任一匹配,優先級最低
修飾符i m s x u U D J改變引擎行為

實戰場景模式庫(可直接複製)

1. Email 驗證與提取(RFC 5322 簡化版,生產建議用 filter_var($email, FILTER_VALIDATE_EMAIL))

// 驗證
/^[^@\s]+@[^@\s]+\.[^@\s]+$/isu

// 結構化提取
/^(?<local>[^@\s]+)@(?<domain>(?<sub>[\w-]+\.)*(?<tld>[\w-]+))$/isu

2. URL 驗證與解析

// 完整 URL 驗證
/^https?:\/\/(?:[\p{L}\p{N}-]+\.)+[\p{L}]{2,}(?:\/[\p{L}\p{N}._~!$&'()*+,;=:@%/-]*)?$/u

// 解析協議、域名、路徑、查詢、片段
/^(?<scheme>https?):\/\/(?<host>[\p{L}\p{N}-]+(?:\.[\p{L}\p{N}-]+)*)(?:\/(?<path>[\p{L}\p{N}._~!$&'()*+,;=:@%/-]*))?(?:\?(?<query>[\p{L}\p{N}._~!$&'()*+,;=:@%/-]*))?(?:#(?<fragment>[\p{L}\p{N}._~!$&'()*+,;=:@%/-]*))?$/u

3. HTML 標籤屬性提取(不建議用正則解析完整 HTML,請用 DOMDocument)

// 單標籤屬性 key="value"
/(\w+)\s*=\s*"([^"]*)"/

// 圖片 src 提取
/<img\s+[^>]*src\s*=\s*["']([^"']+)["']/i

// 連結 href + 錨文本
/<a\s+[^>]*href\s*=\s*["']([^"']+)["'][^>]*>(.*?)<\/a>/is

4. 日期時間格式

// ISO 8601 Y-m-d H:i:s
/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/

// 常見中文日期 2023年12月1日 / 2023-12-01 / 2023/12/01
/^\d{4}[年\/\-](0?[1-9]|1[0-2])[月\/\-](0?[1-9]|[12]\d|3[01])[日]?$/

// 時間戳 (10/13 位)
/^\d{10}(\d{3})?$/

5. IPv4 / IPv6 / CIDR

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

// CIDR 192.168.1.0/24
/^((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)\/(3[0-2]|[12]?\d)$/

6. 日誌通用解析 (Nginx/Apache Combined 格式)

/^(?<ip>\S+)\s+(?<ident>\S+)\s+(?<user>\S+)\s+\[(?<time>[^\]]+)\]\s+"(?<request>[^"]+)"\s+(?<status>\d{3})\s+(?<size>\d+)\s+"(?<referer>[^"]*)"\s+"(?<ua>[^"]*)"$/
// 解析出:ip, ident, user, time, request, status, size, referer, ua

7. CSV 行分割(處理引號內逗號、換行、雙引號轉義)

// 單行 CSV
$fields = preg_split('/,(?=(?:[^"]*"[^"]*")*[^"]*$)/', $line);

// 多行 CSV 需用狀態機或 str_getcsv()
$fields = str_getcsv($line); // PHP 內建,正確處理所有邊界

8. 手機號(中國大陸主流段)

/^1[3-9]\d{9}$/

9. 密碼強度(8-20 位,含大小寫、數字、特殊符號)

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*]).{8,20}$/

10. 中文斷句(按。!?;分割,保留標點)

preg_split('/([。!?;])/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

PHP 代碼最佳實踐模板

模板 1:布林驗證

function isValidEmail(string $email): bool {
    return (bool)preg_match('/^[^@\s]+@[^@\s]+\.[^@\s]+$/isu', $email);
}

模板 2:結構化提取

function parseDate(string $date): ?array {
    if (preg_match('/^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})$/', $date, $m)) {
        return ['year'=>(int)$m['y'], 'month'=>(int)$m['m'], 'day'=>(int)$m['d']];
    }
    return null;
}

模板 3:全域提取處理

function extractLinks(string $html): array {
    preg_match_all('/<a\s+href="([^"]+)"[^>]*>(.*?)<\/a>/is', $html, $m, PREG_SET_ORDER);
    return array_map(fn($match) => ['url'=>$match[1], 'text'=>strip_tags($match[2])], $m);
}

模板 4:動態替換(回調)

function highlightKeywords(string $text, array $keywords): string {
    if (empty($keywords)) return $text;
    $pattern = '/' . implode('|', array_map('preg_quote', $keywords, ['/'])) . '/iu';
    return preg_replace_callback($pattern, fn($m) => '' . $m[0] . '', $text);
}

遷移指南:從 ereg 到 preg

  1. 加分隔符:ereg('abc', $s) → preg_match('/abc/', $s)
  2. 大小寫改修飾符:eregi('abc', $s) → preg_match('/abc/i', $s)
  3. 點號行為:若依賴匹配換行,加 s:/./s
  4. 貪婪控制:ereg_replace('a.*b', '-', $s) → preg_replace('/a.*?b/', '-', $s) (非貪婪) 或 /a[^b]++b/ (佔有優先)
  5. 二進制資料:必須改用 preg_*,ereg 遇 \0 截斷。
  6. 分組引用:ereg('(a)(b)', $s, $r) → preg_match('/(a)(b)/', $s, $r),$r[1] 同義。

效能優化鐵律

  1. 能用字串函數別用正則:strpos、str_replace、explode、str_getcsv。
  2. 錨定開頭結尾:^pattern$ 避免掃描整字串。
  3. 明確字元類別代替點號:[^"]* 比 .*? 快 10 倍且安全。
  4. 佔有優先量詞 ++ *+ 鎖定結構:零回溯,線性時間。
  5. 預編譯重用模式:常量模式定義在類常量或配置,避免迴圈重複建構字串。

收藏本模式庫,下次遇到文字提取、驗證、清洗、重構任務,直接複製適配,專注業務邏輯開發。

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