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

PHP 正則表達式修飾符完整解析:/i /s /u /U /x 等詳解

     編輯:PHP 綜合知識

前言

PCRE 正則修飾符 (Pattern Modifiers) 控制匹配行為。本文系統整理所有修飾符含義、組合用法與實戰陷阱。

修飾符完整表

修飾符常數功能示例
iPCRE_CASELESS大小寫不敏感/php/i 匹配 PHP/php/Php
mPCRE_MULTILINE多行模式:^/$ 匹配每行首尾/^start/m 匹配每行開頭
sPCRE_DOTALL. 匹配換行符 (預設不匹配)/a.b/s 匹配 "a\nb"
xPCRE_EXTENDED忽略模式空白、允許註釋 #可寫多行可讀正則
uPCRE_UTF8按 UTF-8 處理 (支援中文)/漢字/u 正確匹配
UPCRE_UNGREEDY反轉貪婪/非貪婪預設行為/a.+?b/U 變貪婪
APCRE_ANCHORED強制從字符串開頭匹配 (如 ^)/pattern/A
DPCRE_DOLLAR_ENDONLY$ 僅匹配字符串絕對末尾 (忽略末尾換行)需配合 m 使用
SPCRE_STUDY預編譯優化 (重複使用時)長正則提速
XPCRE_EXTRA嚴格模式:反斜杠後接無意義字符報錯預留未來擴展
JPCRE_DUPNAMES允許重複命名子組 (?<name>...)/(?<x>a)|(?<x>b)/J

常用組合

/pattern/iu      // 經典:不區分大小寫 + UTF-8
/pattern/is      // 單行模式:.匹配換行 + 不區分大小寫
/pattern/isu     // 通用:多行文本、中文、大小寫
/pattern/xu      // 可讀模式:可寫註釋、縮進、UTF-8

實戰範例

1. 多行匹配 (m + s)

$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/^Line \d$/m', $text, $m); // 匹配每行
preg_match('/Line 1.Line 3/s', $text);     // . 跨行匹配

2. UTF-8 中文處理 (u)

$str = "你好世界";
// 無 u: 按字節匹配,可能誤傷
preg_match('/^.{2}/', $str);      // 匹配 "你" (2字節) + "好" 第1字節 = 亂碼
preg_match('/^.{2}/u', $str);     // 正確匹配 "你好" (2字符)

// 字符邊界
preg_match('/\b漢字\b/u', $str);  // \b 在 u 模式下正確識別中文邊界

3. 非貪婪與 U 修飾符

$html = '<div>A</div><div>B</div>';

// 預設貪婪
preg_match('/<div>.+<\/div>/', $html);   // 匹配整串 "A</div><div>B"

// 非貪婪 ?
preg_match('/<div>.+?<\/div>/', $html);  // 匹配 "<div>A</div>"

// U 修飾符反轉預設
preg_match('/<div>.+<\/div>/U', $html);   // 等同非貪婪,匹配 "<div>A</div>"
preg_match('/<div>.+?<\/div>/U', $html);  // 反而變貪婪,匹配整串

4. 可讀正則 (x)

進階:內嵌修飾符

在模式內部動態切換:

/(?i)case(?-i)sensitive/  // "case" 不區分大小寫,"sensitive" 區分
/(?s).*$/                 // 僅此段啟用 s
/(?U).+/                  // 僅此段反轉貪婪

常見陷阱

  1. 忘記 u 處理中文:導致字符截斷、邊界錯誤、量詞異常
  2. 混淆 m/s:m 影響 ^$,s 影響 .
  3. U 修飾符濫用:降低可讀性,建議顯式用 ? 控制貪婪
  4. 分隔符衝突:模式含 / 時用 #、~、@ 等替代

效能建議

  • 重複使用的正則加 S 修飾符預編譯
  • 避免災難性回溯:用具體字符類代替 .*,限制量詞上限 {1,100}
  • 長文本用 preg_match_all 分段處理
  • 極高性能需求考慮 re2 (Google RE2) 或編寫 C 擴展

總結

掌握修飾符組合 (isu 為通用基礎)、內嵌修飾符靈活控制、x 寫可維護正則,是 PHP 正則高手必備技能。調試時善用 preg_last_error()、preg_last_error_msg() (PHP 8+) 定位問題。

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