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

PHP 正則表達式兩大關鍵筆記:貪婪模式與斷言機制

     編輯:PHP 相關知識

一、貪婪與非貪婪匹配

預設量詞 *、+、?、{m,n} 皆為「貪婪」,嘗試匹配最長字串。經典問題:匹配 C 註解 /* ... */。

/*first*/ not comment /*second*/

模式 /\*.*\*/ 會匹配整行 (含中間的 not comment)。

解決:非貪婪量詞

在量詞後加 ? 變非貪婪:/\*.*?\*/ 僅匹配最短區段。

修飾字 /U 可反轉整個模式預設貪婪行為,但與 ? 同時出現會相互抵消。

實測範例

$str = "asdf/*asdfaldsfasdf*/asfdasldf;kfldsj*/asfddsaf";
// 非貪婪
preg_match('/\*.*?\*/', $str, $m); // 匹配 /*asdfaldsfasdf*/
// 貪婪
preg_match('/\*.*\*/', $str, $m);  // 匹配整個長字串
// /U 修飾字
preg_match('/\*.*\*/U', $str, $m); // 同非貪婪

二、斷言

斷言不消耗字元,僅檢查位置前後是否符合條件。

向前肯定斷言 (?=...)

\w+(?=;)  // 匹配分號前的單字,不含分號

向前否定斷言 (?!...)

foo(?!bar)  // 匹配不被 "bar" 跟隨的 "foo"

注意:(?!foo)bar 無意義,因斷言在 bar 前檢查,實際應寫 (? (向後否定)。

向後肯定斷言 (?<=...)

(?<=\$)\d+  // 匹配 $ 符號後的數字

向後否定斷言 (?
(?

注意:foo(? 無意義,向後斷言必須放在目標字元前。

速查表

語法名稱方向含義
(?=pattern)向前肯定前後面符合 pattern
(?!pattern)向前否定前後面不符合 pattern
(?<=pattern)向後肯定後前面符合 pattern
(?向後否定後前面不符合 pattern

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