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

PHP 正則表達式完全手冊:PCRE 函數、元字符、修飾符與實戰技巧

     編輯:PHP 相關知識

系統整理 PHP PCRE 正則核心知識體系:兩大函數族、原子/元字符/修飾符三層語法、運算優先級、六大核心功能(匹配/替換/分割/回調/貪婪控制/邊界斷言),附實戰常用模式庫。

一、核心函數族

函數用途返回值
preg_match單次匹配int (0/1/false),匹配內容寫入 $matches
preg_match_all全局匹配int 匹配次數,$matches 結構可通過 PREG_PATTERN_ORDER/PREG_SET_ORDER 控制
preg_replace搜索替換混合:字符串/數組,支持 $callback (e 修飾符已棄用)
preg_split正則分割數組,支持 LIMIT、PREG_SPLIT_NO_EMPTY 等標誌
preg_grep數組過濾返回匹配模式的鍵值子集
preg_quote元字符轉義字符串,用於動態構建模式

棄用:ereg/eregi/split 等 POSIX 族函數已在 PHP 7 移除,統一用 PCRE。

二、語法三要素

1. 原子 (字面匹配單元)

  • 普通字符:a-z A-Z 0-9
  • 字符類:[abc]、[^abc]、[a-z]
  • 預定義字符類:\d \D \w \W \s \S
  • 分組:(abc) 捕獲組,(?:abc) 非捕獲組

2. 元字符 (控制匹配行為)

符號含義
*前一原子 0~n 次
+前一原子 1~n 次
?前一原子 0~1 次
{m,n}前一原子 m~n 次
.任意字符 (除換行,s 修飾符可含換行)
|分支選擇 (低優先級)
^ $字符串開始/結束 (m 修飾符變為行首/行尾)
\b \B單詞邊界/非邊界
(?=) (?!) (?<=) (?正向/負向 預瞻/回顧 斷言 (零寬斷言)

3. 模式修飾符 (模式結尾標誌)

/pattern/修飾符
修飾符作用
i忽略大小寫
m多行模式 (^$ 匹配行首尾)
s單行模式 (. 匹配換行)
x忽略模式空白/註釋 (可寫多行可讀模式)
uUTF-8 模式 (正確處理多字節字符)
U非貪婪模式 (反轉 *+? 預設行為)
A強制從字符串開始匹配
D$ 僅匹配絕對結尾 (不匹配末尾換行前)

三、運算優先級 (高→低)

  1. () (?:) (?=) (?!) (?<=) (? 分組與斷言
  2. * + ? {m,n} 量詞
  3. ^ $ \b \B 邊界斷言
  4. | 分支選擇

四、實戰模式庫

// 郵箱 (RFC 5322 簡化版)
/^[\w.+-]+@[\w-]+\.[\w.-]+$/u

// 手機號 (中國大陸)
/^1[3-9]\d{9}$/

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

// HTML 標籤屬性提取
/<(\w+)\s+([^>]*?)>/is

// 非貪婪提取標簽內容
/(.*?)<\/div>/is

// 密碼強度 (8-20 位,含大小寫數字特殊符)
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,20}$/

五、性能與避坑

  1. 避免災難性回溯:(.*)* 類嵌套量詞,改用定長或原子組 (?>...)。
  2. 善用非捕獲組:(?:...) 減少內存分配。
  3. 大數據用 preg_match_all + PREG_OFFSET_CAPTURE 避免重複掃描。
  4. UTF-8 必加 u 修飾符,否則 .、\w 按字節匹配導致亂碼。
  5. preg_replace_callback 替代 /e 修飾符 (PHP 7 移除)。

正則是文本處理的瑞士軍刀,掌握 PCRE 全集能力,能用最少代碼解決最複雜的解析提取問題。

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