PHP中的正規表示式及模式匹配

大江小浪發表於2012-02-04
PHP中對於正則處理文字提供了兩種方式,一種是PCRE方式(PCRE庫是一個實現了與perl 5在語法和語義上略有差異(詳見下文)的正規表示式模式匹配功能的函式集. 當前的實現對應於perl 5.005.);另一個是POSIX方式。
PCRE函式庫中的函式使用的模式語法非常類似perl. 表示式必須用分隔符閉合, 比如一個正斜槓(/). 分隔符可以使任意非字母數字, 除反斜槓()和空位元組之外的非空白ascii字元. 如果分隔符 在表示式中使用, 需要使用反斜線進行轉義. 自php 4.0.4開始, 可以使用perl樣式的(), {}, []以及<>作為分隔符. 更詳細的解釋參見模式語法.
結束分隔符後面可以緊跟模式修飾符來影響匹配效果. 參見模式修飾符.
PCRE的模式修正符
i (PCRE_CASELESS) 
如果設定此修正符,模式中的字元將同時匹配大小寫字母。
s(PCRE_DOTALL)
如果設定了此修正符,模式中的圓點元字元(.)匹配所有的字元,包括換行符。沒有此設定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字元類例如 [^a] 總是匹配換行符的,無論是否設定了此修正符。
m(PCRE_MULTILINE)
預設情況下,PCRE 將目標字串作為單一的一“行”字元所組成的(甚至其中包含有換行符也是如此)。“行起始”元字元(^)僅僅匹配字串的起始,“行結束”元字元($)僅僅匹配字串的結束,或者最後一個字元是換行符時其前面(除非設定了 D 修正符)。這和 Perl 是一樣的。當設定了此修正符,“行起始”和“行結束”除了匹配整個字串開頭和結束外,還分別匹配其中的換行符的之後和之前。這和 Perl 的 /m 修正符是等效的。如果目標字串中沒有“
”字元或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。
x (PCRE_EXTENDED)
如果設定了這個修飾符, 模式中的沒有經過轉義的或不在字元類中的空白資料字元總會被忽略, 並且位於一個未轉義的字元類外部的#字元和下一個換行符之間的字元也被忽略. 這個修飾符 等同於perl中的/x修飾符, 使被編譯模式中可以包含註釋. 注意: 這僅用於資料字元. 空白字元 還是不能在模式的特殊字元序列中出現, 比如序列(?(引入了一個條件子組(譯註: 這種語法定義的 特殊字元序列中如果出現空白字元會導致編譯錯誤. 比如( ?(就會導致錯誤.).
e (PREG_REPLACE_EVAL)
如果這個修飾符設定了, preg_replace()在進行了對替換字串的 後向引用替換之後, 將替換後的字串作為php程式碼評估之行(eval函式方式), 並使用之行結果 作為實際參與替換的字串. 單引號, 雙引號, 反斜線()和NULL字元在 後向引用替換時會被用反斜線轉義.
僅preg_replace()使用此修飾符, 其他PCRE函式忽略此修飾符.
A (PCRE_ANCHORED)
如果設定了這個修飾符, 模式被強制為”錨定”模式, 也就是說約束匹配使其僅從 目標字串的開始位置搜尋. 這個效果同樣可以使用適當的模式構造出來, 並且 這也是perl種實現這種模式的唯一途徑.
D (PCRE_DOLLAR_ENDONLY)
如果這個修飾符被設定, 模式中的元字元美元符號僅僅匹配目標字串的末尾. 如果這個修飾符 沒有設定, 當字串以一個換行符結尾時, 美元符號還會匹配該換行符(但不會匹配之前的任何換行符). 如果設定了修飾符m, 這個修飾符被忽略. 在perl中沒有與此修飾符等同的修飾符.
S
當一個模式需要多次使用的時候, 為了得到匹配速度的提升, 值得花費一些時間 對其進行一些額外的分析. 如果設定了這個修飾符, 這個額外的分析就會執行. 當前, 這種對一個模式的分析僅僅適用於非錨定模式的匹配(即沒有單獨的固定開始字元).
U (PCRE_UNGREEDY)
這個修飾符逆轉了量詞的”貪婪”模式. 使量詞預設為非貪婪的, 通過量詞後緊跟? 的方式可以使其成為貪婪的. 這和perl是不相容的. 它同樣可以使用 模式內修飾符設定 (?U)進行設定, 或者在量詞後以問號標記其非貪婪(比如.*?).在非貪婪模式, 通常不能匹配超過 pcre.backtrack_limit 的字元.
X (PCRE_EXTRA)
這個修飾符開啟了PCRE與perl不相容的附件功能. 模式中的任意反斜線後就ingen一個 沒有特殊含義的字元都會導致一個錯誤, 以此保留這些字元以保證向後相容性. 預設 情況下, 在perl中, 反斜線緊跟一個沒有特殊含義的字元被認為是該字元的原文. 當前沒有其他特性由這個修飾符控制.
J (PCRE_INFO_JCHANGED)
內部選項設定(?J)修改本地的PCRE_DUPNAMES選項. 允許子組重名. (譯註:只能通過內部選項設定, 外部的/J設定會產生錯誤.)
u (PCRE8)
此修正符開啟一個與perl不相容的附加功能. 模式字串被認為是utf-8的. 這個修飾符 從unix版php 4.1.0或更高, win32版php 4.2.3開始可用. php 4.3.5開始檢查模式的utf-8合法性. This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.
參考資料:


相關文章