解析PHP中的正則表達(dá)式以及模式匹配
更新時(shí)間:2013年06月19日 17:49:48 作者:
本篇文章是對(duì)PHP中的正則表達(dá)式及模式匹配進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
PHP中對(duì)于正則處理文本提供了兩種方式,一種是PCRE方式(PCRE庫(kù)是一個(gè)實(shí)現(xiàn)了與perl 5在語(yǔ)法和語(yǔ)義上略有差異(詳見(jiàn)下文)的正則表達(dá)式模式匹配功能的函數(shù)集. 當(dāng)前的實(shí)現(xiàn)對(duì)應(yīng)于perl 5.005.);另一個(gè)是POSIX方式。
PCRE 函數(shù)庫(kù)中的函數(shù)使用的模式語(yǔ)法非常類似perl. 表達(dá)式必須用分隔符閉合, 比如一個(gè)正斜杠(/). 分隔符可以使任意非字母數(shù)字, 除反斜杠(\)和空字節(jié)之外的非空白ascii字符. 如果分隔符 在表達(dá)式中使用, 需要使用反斜線進(jìn)行轉(zhuǎn)義. 自php 4.0.4開(kāi)始, 可以使用perl樣式的(), {}, []以及<>作為分隔符. 更詳細(xì)的解釋參見(jiàn)模式語(yǔ)法.
結(jié)束分隔符后面可以緊跟模式修飾符來(lái)影響匹配效果. 參見(jiàn)模式修飾符.
PCRE的模式修正符
i (PCRE_CASELESS)
如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫(xiě)字母。
s(PCRE_DOTALL)
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字符類例如 [^a] 總是匹配換行符的,無(wú)論是否設(shè)定了此修正符。
m(PCRE_MULTILINE)
默認(rèn)情況下,PCRE 將目標(biāo)字符串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此)?!靶衅鹗肌痹址╚)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅僅匹配字符串的結(jié)束,或者最后一個(gè)字符是換行符時(shí)其前面(除非設(shè)定了 D 修正符)。這和 Perl 是一樣的。當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開(kāi)頭和結(jié)束外,還分別匹配其中的換行符的之后和之前。這和 Perl 的 /m 修正符是等效的。如果目標(biāo)字符串中沒(méi)有“\n”字符或者模式中沒(méi)有 ^ 或 $,則設(shè)定此修正符沒(méi)有任何效果。
x (PCRE_EXTENDED)
如果設(shè)置了這個(gè)修飾符, 模式中的沒(méi)有經(jīng)過(guò)轉(zhuǎn)義的或不在字符類中的空白數(shù)據(jù)字符總會(huì)被忽略, 并且位于一個(gè)未轉(zhuǎn)義的字符類外部的#字符和下一個(gè)換行符之間的字符也被忽略. 這個(gè)修飾符 等同于perl中的/x修飾符, 使被編譯模式中可以包含注釋. 注意: 這僅用于數(shù)據(jù)字符. 空白字符 還是不能在模式的特殊字符序列中出現(xiàn), 比如序列(?(引入了一個(gè)條件子組(譯注: 這種語(yǔ)法定義的 特殊字符序列中如果出現(xiàn)空白字符會(huì)導(dǎo)致編譯錯(cuò)誤. 比如( ?(就會(huì)導(dǎo)致錯(cuò)誤.).
e (PREG_REPLACE_EVAL)
如果這個(gè)修飾符設(shè)置了, preg_replace()在進(jìn)行了對(duì)替換字符串的 后向引用替換之后, 將替換后的字符串作為php代碼評(píng)估之行(eval函數(shù)方式), 并使用之行結(jié)果 作為實(shí)際參與替換的字符串. 單引號(hào), 雙引號(hào), 反斜線(\)和NULL字符在 后向引用替換時(shí)會(huì)被用反斜線轉(zhuǎn)義.
僅preg_replace()使用此修飾符, 其他PCRE函數(shù)忽略此修飾符.
A (PCRE_ANCHORED)
如果設(shè)置了這個(gè)修飾符, 模式被強(qiáng)制為"錨定"模式, 也就是說(shuō)約束匹配使其僅從 目標(biāo)字符串的開(kāi)始位置搜索. 這個(gè)效果同樣可以使用適當(dāng)?shù)哪J綐?gòu)造出來(lái), 并且 這也是perl種實(shí)現(xiàn)這種模式的唯一途徑.
D (PCRE_DOLLAR_ENDONLY)
如果這個(gè)修飾符被設(shè)置, 模式中的元字符美元符號(hào)僅僅匹配目標(biāo)字符串的末尾. 如果這個(gè)修飾符 沒(méi)有設(shè)置, 當(dāng)字符串以一個(gè)換行符結(jié)尾時(shí), 美元符號(hào)還會(huì)匹配該換行符(但不會(huì)匹配之前的任何換行符). 如果設(shè)置了修飾符m, 這個(gè)修飾符被忽略. 在perl中沒(méi)有與此修飾符等同的修飾符.
S
當(dāng)一個(gè)模式需要多次使用的時(shí)候, 為了得到匹配速度的提升, 值得花費(fèi)一些時(shí)間 對(duì)其進(jìn)行一些額外的分析. 如果設(shè)置了這個(gè)修飾符, 這個(gè)額外的分析就會(huì)執(zhí)行. 當(dāng)前, 這種對(duì)一個(gè)模式的分析僅僅適用于非錨定模式的匹配(即沒(méi)有單獨(dú)的固定開(kāi)始字符).
U (PCRE_UNGREEDY)
這個(gè)修飾符逆轉(zhuǎn)了量詞的"貪婪"模式. 使量詞默認(rèn)為非貪婪的, 通過(guò)量詞后緊跟? 的方式可以使其成為貪婪的. 這和perl是不兼容的. 它同樣可以使用 模式內(nèi)修飾符設(shè)置 (?U)進(jìn)行設(shè)置, 或者在量詞后以問(wèn)號(hào)標(biāo)記其非貪婪(比如.*?).在非貪婪模式, 通常不能匹配超過(guò) pcre.backtrack_limit 的字符.
X (PCRE_EXTRA)
這個(gè)修飾符打開(kāi)了PCRE與perl不兼容的附件功能. 模式中的任意反斜線后就ingen一個(gè) 沒(méi)有特殊含義的字符都會(huì)導(dǎo)致一個(gè)錯(cuò)誤, 以此保留這些字符以保證向后兼容性. 默認(rèn) 情況下, 在perl中, 反斜線緊跟一個(gè)沒(méi)有特殊含義的字符被認(rèn)為是該字符的原文. 當(dāng)前沒(méi)有其他特性由這個(gè)修飾符控制.
J (PCRE_INFO_JCHANGED)
內(nèi)部選項(xiàng)設(shè)置(?J)修改本地的PCRE_DUPNAMES選項(xiàng). 允許子組重名. (譯注:只能通過(guò)內(nèi)部選項(xiàng)設(shè)置, 外部的/J設(shè)置會(huì)產(chǎn)生錯(cuò)誤.)
u (PCRE8)
此修正符打開(kāi)一個(gè)與perl不兼容的附加功能. 模式字符串被認(rèn)為是utf-8的. 這個(gè)修飾符 從unix版php 4.1.0或更高, win32版php 4.2.3開(kāi)始可用. php 4.3.5開(kāi)始檢查模式的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.
PCRE 函數(shù)庫(kù)中的函數(shù)使用的模式語(yǔ)法非常類似perl. 表達(dá)式必須用分隔符閉合, 比如一個(gè)正斜杠(/). 分隔符可以使任意非字母數(shù)字, 除反斜杠(\)和空字節(jié)之外的非空白ascii字符. 如果分隔符 在表達(dá)式中使用, 需要使用反斜線進(jìn)行轉(zhuǎn)義. 自php 4.0.4開(kāi)始, 可以使用perl樣式的(), {}, []以及<>作為分隔符. 更詳細(xì)的解釋參見(jiàn)模式語(yǔ)法.
結(jié)束分隔符后面可以緊跟模式修飾符來(lái)影響匹配效果. 參見(jiàn)模式修飾符.
PCRE的模式修正符
i (PCRE_CASELESS)
如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫(xiě)字母。
s(PCRE_DOTALL)
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字符類例如 [^a] 總是匹配換行符的,無(wú)論是否設(shè)定了此修正符。
m(PCRE_MULTILINE)
默認(rèn)情況下,PCRE 將目標(biāo)字符串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此)?!靶衅鹗肌痹址╚)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅僅匹配字符串的結(jié)束,或者最后一個(gè)字符是換行符時(shí)其前面(除非設(shè)定了 D 修正符)。這和 Perl 是一樣的。當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開(kāi)頭和結(jié)束外,還分別匹配其中的換行符的之后和之前。這和 Perl 的 /m 修正符是等效的。如果目標(biāo)字符串中沒(méi)有“\n”字符或者模式中沒(méi)有 ^ 或 $,則設(shè)定此修正符沒(méi)有任何效果。
x (PCRE_EXTENDED)
如果設(shè)置了這個(gè)修飾符, 模式中的沒(méi)有經(jīng)過(guò)轉(zhuǎn)義的或不在字符類中的空白數(shù)據(jù)字符總會(huì)被忽略, 并且位于一個(gè)未轉(zhuǎn)義的字符類外部的#字符和下一個(gè)換行符之間的字符也被忽略. 這個(gè)修飾符 等同于perl中的/x修飾符, 使被編譯模式中可以包含注釋. 注意: 這僅用于數(shù)據(jù)字符. 空白字符 還是不能在模式的特殊字符序列中出現(xiàn), 比如序列(?(引入了一個(gè)條件子組(譯注: 這種語(yǔ)法定義的 特殊字符序列中如果出現(xiàn)空白字符會(huì)導(dǎo)致編譯錯(cuò)誤. 比如( ?(就會(huì)導(dǎo)致錯(cuò)誤.).
e (PREG_REPLACE_EVAL)
如果這個(gè)修飾符設(shè)置了, preg_replace()在進(jìn)行了對(duì)替換字符串的 后向引用替換之后, 將替換后的字符串作為php代碼評(píng)估之行(eval函數(shù)方式), 并使用之行結(jié)果 作為實(shí)際參與替換的字符串. 單引號(hào), 雙引號(hào), 反斜線(\)和NULL字符在 后向引用替換時(shí)會(huì)被用反斜線轉(zhuǎn)義.
僅preg_replace()使用此修飾符, 其他PCRE函數(shù)忽略此修飾符.
A (PCRE_ANCHORED)
如果設(shè)置了這個(gè)修飾符, 模式被強(qiáng)制為"錨定"模式, 也就是說(shuō)約束匹配使其僅從 目標(biāo)字符串的開(kāi)始位置搜索. 這個(gè)效果同樣可以使用適當(dāng)?shù)哪J綐?gòu)造出來(lái), 并且 這也是perl種實(shí)現(xiàn)這種模式的唯一途徑.
D (PCRE_DOLLAR_ENDONLY)
如果這個(gè)修飾符被設(shè)置, 模式中的元字符美元符號(hào)僅僅匹配目標(biāo)字符串的末尾. 如果這個(gè)修飾符 沒(méi)有設(shè)置, 當(dāng)字符串以一個(gè)換行符結(jié)尾時(shí), 美元符號(hào)還會(huì)匹配該換行符(但不會(huì)匹配之前的任何換行符). 如果設(shè)置了修飾符m, 這個(gè)修飾符被忽略. 在perl中沒(méi)有與此修飾符等同的修飾符.
S
當(dāng)一個(gè)模式需要多次使用的時(shí)候, 為了得到匹配速度的提升, 值得花費(fèi)一些時(shí)間 對(duì)其進(jìn)行一些額外的分析. 如果設(shè)置了這個(gè)修飾符, 這個(gè)額外的分析就會(huì)執(zhí)行. 當(dāng)前, 這種對(duì)一個(gè)模式的分析僅僅適用于非錨定模式的匹配(即沒(méi)有單獨(dú)的固定開(kāi)始字符).
U (PCRE_UNGREEDY)
這個(gè)修飾符逆轉(zhuǎn)了量詞的"貪婪"模式. 使量詞默認(rèn)為非貪婪的, 通過(guò)量詞后緊跟? 的方式可以使其成為貪婪的. 這和perl是不兼容的. 它同樣可以使用 模式內(nèi)修飾符設(shè)置 (?U)進(jìn)行設(shè)置, 或者在量詞后以問(wèn)號(hào)標(biāo)記其非貪婪(比如.*?).在非貪婪模式, 通常不能匹配超過(guò) pcre.backtrack_limit 的字符.
X (PCRE_EXTRA)
這個(gè)修飾符打開(kāi)了PCRE與perl不兼容的附件功能. 模式中的任意反斜線后就ingen一個(gè) 沒(méi)有特殊含義的字符都會(huì)導(dǎo)致一個(gè)錯(cuò)誤, 以此保留這些字符以保證向后兼容性. 默認(rèn) 情況下, 在perl中, 反斜線緊跟一個(gè)沒(méi)有特殊含義的字符被認(rèn)為是該字符的原文. 當(dāng)前沒(méi)有其他特性由這個(gè)修飾符控制.
J (PCRE_INFO_JCHANGED)
內(nèi)部選項(xiàng)設(shè)置(?J)修改本地的PCRE_DUPNAMES選項(xiàng). 允許子組重名. (譯注:只能通過(guò)內(nèi)部選項(xiàng)設(shè)置, 外部的/J設(shè)置會(huì)產(chǎn)生錯(cuò)誤.)
u (PCRE8)
此修正符打開(kāi)一個(gè)與perl不兼容的附加功能. 模式字符串被認(rèn)為是utf-8的. 這個(gè)修飾符 從unix版php 4.1.0或更高, win32版php 4.2.3開(kāi)始可用. php 4.3.5開(kāi)始檢查模式的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.
相關(guān)文章
PHP實(shí)現(xiàn)利用MySQL保存session的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)利用MySQL保存session的方法,是PHP程序設(shè)計(jì)中比較有實(shí)用價(jià)值的一個(gè)技巧,需要的朋友可以參考下2014-08-08
PHP7如何開(kāi)啟Opcode打造強(qiáng)悍性能詳解
這篇文章主要給大家介紹了關(guān)于PHP7如何開(kāi)啟Opcode打造強(qiáng)悍性能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
PHP下通過(guò)系統(tǒng)信號(hào)量加鎖方式獲取遞增序列ID
前一陣子,設(shè)計(jì)LAJP時(shí)需要在PHP中生成唯一ID,看似小菜一碟卻著實(shí)讓我為難了,在Java中一個(gè)同步方法即可搞定的事,但在PHP中卻沒(méi)有好的解決思路。2009-09-09
PHP ajax跨子域的解決方案之document.domain+iframe實(shí)例分析
這篇文章主要介紹了PHP ajax跨子域的解決方案之document.domain+iframe,結(jié)合實(shí)例形式分析了PHP ajax跨子域的解決方案document.domain+iframe的基本原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
提示Trying to clone an uncloneable object of class Imagic的解決
使用網(wǎng)上流傳的一個(gè)程序?qū)崿F(xiàn)pdf截圖為png,需要使用Imagic擴(kuò)展,安裝后出現(xiàn)Trying to clone an uncloneable object of class Imagic提示,下面是具體的解決方法分享。2011-10-10
php 過(guò)濾英文標(biāo)點(diǎn)符號(hào)及過(guò)濾中文標(biāo)點(diǎn)符號(hào)代碼
這篇文章主要介紹了php過(guò)濾英文標(biāo)點(diǎn)符號(hào)及過(guò)濾中文標(biāo)點(diǎn)符號(hào)的方法,需要的朋友可以參考下2014-06-06

