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

深入理解 PHP 正則修飾符:i、s、U 的含義與用法

     編輯:PHP 綜合知識

在 preg_match()、preg_match_all() 等函數中,模式後的修飾符(如 /pattern/isU)決定了匹配行為。本文詳細解析 i、s、U 三個常用修飾符的作用與差異。

修飾符速查表

修飾符名稱作用
i (PCRE_CASELESS)不區分大小寫匹配時忽略字母大小寫,/abc/i 可匹配 "ABC"、"Abc" 等。
s (PCRE_DOTALL)單行模式 / 點號匹配換行使元字符 . 匹配任意字符(含換行符 \n)。預設下 . 不匹配換行。
U (PCRE_UNGREEDY)非貪婪模式反轉量詞預設貪婪行為:*、+、?、{m,n} 變為非貪婪;需加 ?(如 *?)才恢復貪婪。

實例演示

$html = "<div>內容1</div>\n<div>內容2</div>";

// 無 s 修飾符:. 不匹配換行,只匹配第一個 div
preg_match('/<div>(.*)<\/div>/i', $html, $m1); 
// $m1[1] = "內容1"

// 加上 s:. 匹配換行,貪婪匹配到最後一個 </div>
preg_match('/<div>(.*)<\/div>/is', $html, $m2); 
// $m2[1] = "內容1</div>\n<div>內容2"

// isU:非貪婪,匹配到最近的 </div>
preg_match('/<div>(.*)<\/div>/isU', $html, $m3); 
// $m3[1] = "內容1"

常見誤區與最佳實踐

  • i 與中文無關:中文字符無大小寫,i 僅影響 ASCII 字母。
  • s 不等於「多行模式」:多行模式是 m(讓 ^$ 匹配行首尾),s 僅控制點號行為。
  • U 影響所有量詞:開啟後整個模式量詞皆變非貪婪,局部需貪婪時要加 ?(如 *? 變 *),易混淆,建議顯式使用 *?、+? 等非貪婪量詞,而非依賴 U。
  • 組合使用:isu 常用於解析跨行 HTML/JSON,但解析 HTML 推薦用 DOMDocument。

詞邊界 \b 補充

\b 匹配單詞邊界(字母/數字/下劃線與非單詞字符交界)。中文無單詞邊界概念,對中文無效。

$a = "test,admin,abc";
$b = "te";
var_dump(preg_match("/\b{$b}\b/", $a)); // 0,因 "te" 在 "test" 內部,非邊界

掌握修飾符精髓,能寫出更精準、高效的正則表達式。

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