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

PHP 正則特殊字符深度解析:字元類別 [] 與轉義序列 \ 核心用法

     編輯:PHP 相關知識

字元類別 [] 與轉義序列 \ 是正則表達式表達能力的基石。本文深入剖析兩者的語法細節、預定義類別、Unicode 屬性擴展、轉義陷阱與實戰組合模式,助你寫出精準、可讀、高效的正則。

一、字元類別 [] 完整語法

1. 基本形式

  • [abc]:匹配 a、b、c 任一字元。
  • [a-z]:範圍,匹配小寫字母(ASCII 碼連續)。
  • [a-zA-Z0-9_]:等價 \w(ASCII 模式下)。
  • [^abc]:否定類別,匹配非 a/b/c 字元(^ 必須在首位)。
  • []] 或 []:匹配字面 ](放首位或轉義)。
  • [-abc] 或 [abc-]:匹配字面 -(放首尾或轉義)。

2. POSIX 預定義類別(僅在 [] 內使用)

類別含義ASCII 等價
[:alpha:]字母[A-Za-z]
[:alnum:]字母數字[A-Za-z0-9]
[:digit:]數字[0-9]
[:space:]空白字元(空格、\t \n \r \f \v)[\s]
[:upper:]大寫字母[A-Z]
[:lower:]小寫字母[a-z]
[:punct:]標點符號[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
[:xdigit:]十六進制數字[0-9A-Fa-f]
[:cntrl:]控制字元[\x00-\x1F\x7F]
[:print:]可列印字元[\x20-\x7E]
[:graph:]可見字元(非空白可列印)[\x21-\x7E]

用法:[[:alpha:]_] 匹配字母或下劃線。注意:雙層方括號是語法一部分,非巢狀。

3. Unicode 屬性類別(需 u 修飾符,PCRE 8.10+)

  • \p{L} / \p{Letter}:任意字母(含中文、日文、表情符號字母)。
  • \p{N} / \p{Number}:任意數字(含全形數字、羅馬數字)。
  • \p{P} / \p{Punctuation}:標點。
  • \p{S} / \p{Symbol}:符號(數學、貨幣、箭頭等)。
  • \p{M} / \p{Mark}:修飾符(重音、聲調符)。
  • \p{Z} / \p{Separator}:分隔符(空格、行分隔、段分隔)。
  • \p{C} / \p{Other}:其他(控制、格式、代理、私用、未分配)。
  • 具體腳本:\p{Han}(漢字)、\p{Hiragana}(平假名)、\p{Katakana}(片假名)、\p{Arabic}、\p{Latin}。
  • 否定:\P{L} = 非字母。

範例:/[\p{Han}\p{Katakana}\p{Hiragana}]+/u 匹配連續中日文。

4. 字元類別運算(PCRE 7.2+,實驗性)

  • [[a-z]--[aeiou]]:差集,小寫輔音字母。
  • [[a-z]~~[aeiou]]:對稱差集。
  • [[a-z]&&[^aeiou]]:交集(等價前者)。

二、轉義序列 \ 完整圖譜

1. 元字元轉義(匹配字面字元)

以下字元在正則中有特殊含義,需轉義匹配字面值:

. \ + * ? [ ] ^ $ ( ) { } | / # 

例:\. 匹配點號、\[ 匹配左括號、\\ 匹配反斜線。

2. 控制字元轉義

序列字元十六進制
\t製表符0x09
\n換行 (LF)0x0A
\r回車 (CR)0x0D
\f換頁0x0C
\v垂直製表0x0B
\a響鈴0x07
\eEscape0x1B

3. 八進位/十六進位/Unicode 碼點

  • \0nn / \nnn:八進位(最多 3 位,\0 開頭避免與回溯引用衝突)。
  • \xhh:兩位十六進位。
  • \x{hhhh}:任意長度十六進位 Unicode 碼點(需 u 修飾符)。
  • \u{hhhh}:同 \x{}(PHP 7.0+,更直觀)。

4. 字元類別簡寫(在 [] 內外均可用)

序列含義等價類別 (ASCII)Unicode (u修飾符)
\d數字[0-9]\p{Nd}
\D非數字[^0-9]\P{Nd}
\w單詞字元[A-Za-z0-9_][\p{L}\p{N}\p{Pc}]
\W非單詞字元[^A-Za-z0-9_][^\p{L}\p{N}\p{Pc}]
\s空白字元[\t\n\r\f\v ]\p{Z}\t\n\r\f\v
\S非空白字元[^\t\n\r\f\v ][^\p{Z}\t\n\r\f\v]
\h水平空白[\t ][\p{Zs}\t]
\H非水平空白[^\t ][^\p{Zs}\t]
\v垂直空白[\n\r\f\v][\p{Zl}\p{Zp}\n\r\f\v]
\V非垂直空白[^\n\r\f\v][^\p{Zl}\p{Zp}\n\r\f\v]
\R任意換行序列(?>\r\n|\n|\r|\f|\v)同左
\X擴展書寫字素簇—單一可見字元(含組合字元)

5. 斷言相關轉義(零寬斷言)

  • \b / \B:單詞邊界 / 非邊界(依賴 \w 定義)。
  • \A / \Z / \z:字串絕對開頭/結尾/真實結尾。
  • \G:上次匹配結束位置(配合 preg_match_all 連續匹配)。
  • \K:重置匹配起始位置(丟棄前面匹配內容),極佳替代正向後顧:foo\Kbar 匹配 foobar 中的 bar,整體匹配結果僅 bar。

三、實戰組合模式

1. 驗證中文姓名(2-10 個漢字,可含點號間隔)

/^[\p{Han}]{2,10}$/u
/^[\p{Han}]{2,5}(?:·[\p{Han}]{2,5})?$/u  // 含·號

2. 提取完整 URL(含 Unicode 域名)

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

3. 移除控制字元保留可見內容

/[\p{Cc}\p{Cf}]+/u  // 移除控制、格式字元

4. 密碼強度:至少一大一小一數一特殊,8-30 位

/^(?=.*[\p{Ll}])(?=.*[\p{Lu}])(?=.*[\p{Nd}])(?=.*[\p{P}\p{S}]).{8,30}$/u

避坑提醒

  1. 字元類別內 - ^ ] 需轉義或放安全位置:[\-\^\]abc] 或 [abc\-\^\]]。
  2. \w \d \s 在 u 模式下語義變化:預設 ASCII,加 u 變 Unicode,影響邊界判斷。
  3. 雙重轉義陷阱:PHP 字串 '\\d' → 正則引擎見 \d;單引號 '\d' → 正則見 d。建議習慣用單引號 + 雙反斜線 '\\d' 或 "/\\d/"。
  4. \R 不能在 [] 內使用:[\R] 視為 R 字面字元。

精通字元類別與轉義序列,是編寫「可讀、可維護、無 Bug」正則的前提。建議收藏本表,遇到字元匹配疑問即查即用。

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