正則表達式雖然學習曲線陡峭,但掌握後能極大提升文本處理效率,並帶來極強的成就感。本文系統整理了 PHP 正則表達式的核心知識點,包含語法詳解、運算優先級、常用符號表、實戰範例及匹配規則,助你快速建立完整知識體系。
正則表達式的起源可追溯至 1956 年,數學家 Stephen Kleene 基於神經網絡研究提出「正則集的代數」概念。後經 Ken Thompson 引入 Unix qed 編輯器,成為文本編輯與搜索工具的核心組件。正則表達式本質上是描述字符串匹配模式的文本模板,由普通字符(字母、數字、標點)與特殊元字符組成,用於檢查、替換或提取符合條件的子串。
\n(換行)、\t(制表符)、\s(任意空白字符)、\d(數字)等,均有對應的轉義序列與等價字符類。$ () * + . [ ? \ ^ { | 等,若需匹配字面值需用反斜槓轉義。| 限定符 | 含義 | 等價寫法 |
|---|---|---|
* | 零次或多次 | {0,} |
+ | 一次或多次 | {1,} |
? | 零次或一次 | {0,1} |
{n} | 恰好 n 次 | — |
{n,} | 至少 n 次 | — |
{n,m} | n 到 m 次 | — |
預設為貪婪模式(盡可能多匹配),在限定符後加 ? 可啟用非貪婪模式(如 .*?)。
^ $:字符串開始/結束(多行模式下匹配行首/行尾)。\b \B:單詞邊界 / 非單詞邊界。() 搭配 | 實現多選分支,使用 (?:) 可避免捕獲副作用。括號內的子表達式會按順序編號(1-99),可用 \1 \2 等回溯引用。?: ?= ?! 分別為非捕獲組、正向預查、負向預查,預查不消耗字符。
\ 轉義符() (?:) (?=) [] 括號* + ? {n} {n,} {n,m} 限定符^ $ \元字符 位置與順序| 「或」操作| 符號 | 說明 |
|---|---|
\d / \D | 數字 / 非數字 |
\w / \W | 單詞字符(字母數字下劃線) / 非單詞字符 |
\s / \S | 空白字符 / 非空白字符 |
. | 除換行外任意單字符 |
[xyz] / [^xyz] | 字符集 / 排除字符集 |
[a-z] / [^a-z] | 字符範圍 / 排除範圍 |
(?=pattern) | 正向預查(不消耗字符) |
(?!pattern) | 負向預查(不消耗字符) |
\n | 後向引用第 n 個捕獲組 |
\xnn / \unnnn | 十六進制 / Unicode 轉義 |
| 正則 | 用途 |
|---|---|
/\b([a-z]+) \1\b/gi | 檢測連續重複單詞 |
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ | 解析 URL 協議、域、端口、路徑 |
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ | 匹配章節標題 |
/Windows(?=95|98|NT)/ | 僅匹配後跟特定版本的 Windows |
^once 僅匹配以 once 開頭的字符串;bucket$ 匹配以 bucket 結尾;^bucket$ 則精確匹配整個字符串。轉義序列如 \t \n \\ \. 用於匹配特殊字符字面值。
方括號定義字符類:[AaEeIiOoUu] 匹配任一元音;[a-z] 匹配小寫字母;[^0-9] 排除數字。PHP 內置 POSIX 字符類:[[:alpha:]] [[:digit:]] [[:alnum:]] [[:space:]] 等,提升可讀性。
花括號 {n} {n,} {n,m} 分別表示確定、至少、範圍次數。簡寫對應:?={0,1}、*={0,}、+={1,}。實例:^[a-zA-Z0-9_]+$ 匹配含字母數字下劃線的非空串;^-?\d*\.?\d*$ 匹配十進制數字。
/、#,靈活選擇避免過度轉義。i(忽略大小寫)、s(單行模式,讓 . 匹配換行)常用組合。\s 代表空白字符,非字面 s。掌握正則表達式關鍵在於大量練習與查閱手冊,建議收藏本文作為開發時的速查手冊。