修飾符是php中正則表達(dá)式的一個(gè)重要的參考,下面我來給大家轉(zhuǎn)一篇關(guān)于PHP中正則表達(dá)式模式修飾符詳解,有需要了解的朋友可進(jìn)入?yún)⒖紖⒖?
PHP模式修飾符又叫模式修正符,是在正則表達(dá)式的定界符之外使用.主要用來調(diào)整正則表達(dá)式的解釋,提擴(kuò)展了正則表達(dá)式在匹配、替換等操作的某些功能,增強(qiáng)了正則的能力.但是有很多地方的解釋都是錯(cuò)誤的,也容易誤導(dǎo)別人,所以今天我把這個(gè)文檔整理出來,供大家參考.
i 在和正則匹配是不區(qū)分大小寫
m 將字符串視為多行.默認(rèn)的正則開始“^”和結(jié)束“$”將目標(biāo)字條串作為一單一的一“行”字符(甚至其中包括換行符也是如此).如果在修飾符中加上“m”,那么開始和結(jié)束將會(huì)指點(diǎn)字符串的每一行的開頭就是“^”結(jié)束就是“$”.
s 如果設(shè)定了這個(gè)修正符,那么,被匹配的字符串將視為一行來看,包括換行符,換行符將被視為普通字符串.
x 忽略空白,除非進(jìn)行轉(zhuǎn)義的不被忽略.
e只用在preg_replace()函數(shù)中,在替換字符串中逆向引用做正常的替換,將其作為PHP代碼求值,并用其結(jié)果來替換所搜索的字符串.
A 如果使用這個(gè)修飾符,那么表達(dá)式必須是匹配的字符串中的開頭部分.比如說”/a/A”匹配”abcd”.
D 模式中的$字符權(quán)匹配目標(biāo)字符的結(jié)尾.沒有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,美元符號(hào)也會(huì)匹配此字符之前.如果設(shè)定了修正符m則忽略此項(xiàng).
E 與”m”相反,如果使用這個(gè)修飾符,那么”$”將匹配絕對(duì)字符串的結(jié)尾,而不是換行符前面,默認(rèn)就打開了這個(gè)模式.
U 貪婪模式,和問號(hào)的作用差不多,最大限度的匹配就是貪婪模式.
貪婪模式:
比如我們要匹配以字母“a”開頭字母“b”結(jié)尾的字符串,但是需要匹配的字符串在“a”后面含有很多個(gè)“b”,比如“a bbbbbbbbbbbbbbbbb”,那正則表達(dá)式是會(huì)匹配第一個(gè)“b”還是最后一個(gè)“b”呢?如果你使用了貪婪模式,那么會(huì)匹配到最后一個(gè)“b”,反之只是匹配到第一個(gè)“b”.
PHP正則表達(dá)式貪婪模式使用實(shí)例:
1./a.+?b/
2./a.+b/U
對(duì)比不使用貪婪模式的實(shí)例如下:
1./a.+b/
上面使用了一個(gè)修飾符U,詳見關(guān)于修飾符的介紹.
其他資料:
模式修正符: 解說正則表達(dá)式模式中使用的修正符
說明:下面列出了當(dāng)前在 PCRE 中可能使用的修正符.括號(hào)中是這些修正符的內(nèi)部 PCRE 名.修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤.
i (PCRE_CASELESS)
如果設(shè)定此修正符,模式中的字符將同時(shí)匹配大小寫字母.
m(PCRE_MULTILINE)
默認(rèn)情況下,PCRE 將目標(biāo)字符串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此).“行起始”元字符(^)僅僅匹配字符串的起始,“行結(jié)束”元字符($)僅 僅匹配字符串的結(jié)束,或者最后一個(gè)字符是換行符時(shí)其前面(除非設(shè)定了 D 修正符).這和 Perl 是一樣的.
當(dāng)設(shè)定了此修正符,“行起始”和“行結(jié)束”除了匹配整個(gè)字符串開頭和結(jié)束外,還分別匹配其中的換行符的之后和之前.這和 Perl 的 /m 修正符是等效的.如果目標(biāo)字符串中沒有“n”字符或者模式中沒有 ^ 或 $,則設(shè)定此修正符沒有任何效果.
s(PCRE_DOTALL)
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符.沒有此設(shè)定的話,則不包括換行符.這和 Perl 的 /s 修正符是等效的.排除字符類例如 [^a] 總是匹配換行符的,無論是否設(shè)定了此修正符.
x(PCRE_EXTENDED)
如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略,在未轉(zhuǎn)義的字符類之外的 # 以及下一個(gè)換行符之間的所有字符,包括兩頭,也都被忽略.這和 Perl 的 /x 修正符是等效的,使得可以在復(fù)雜的模式中加入注釋.然而注意,這僅適用于數(shù)據(jù)字符.空白字符可能永遠(yuǎn)不會(huì)出現(xiàn)于模式中的特殊字符序列,例如引入條件子模式 的序列 (?( 中間.
e
如果設(shè)定了此修正符,preg_replace() 在替換字符串中對(duì)逆向引用作正常的替換,將其作為 PHP 代碼求值,并用其結(jié)果來替換所搜索的字符串.只有 preg_replace() 使用此修正符,其它 PCRE 函數(shù)將忽略之.
注: 本修正符在 PHP3 中不可用.
A(PCRE_ANCHORED)
如果設(shè)定了此修正符,模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配.此效果也可以通過適當(dāng)?shù)哪J奖旧韥韺?shí)現(xiàn)(在 Perl 中實(shí)現(xiàn)的唯一方法).
D(PCRE_DOLLAR_ENDONLY)
如果設(shè)定了此修正符,模式中的美元元字符僅匹配目標(biāo)字符串的結(jié)尾.沒有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,美元符號(hào)也會(huì)匹配此字符之前(但不會(huì)匹配任何其它換行符之前).如果設(shè)定了 m 修正符則忽略此選項(xiàng).Perl 中沒有與其等價(jià)的修正符.
S
當(dāng)一個(gè)模式將被使用若干次時(shí),為加速匹配起見值得先對(duì)其進(jìn)行分析.如果設(shè)定了此修正符則會(huì)進(jìn)行額外的分析.目前,分析一個(gè)模式僅對(duì)沒有單一固定起始字符的 non-anchored 模式有用.
U(PCRE_UNGREEDY)
本修正符反轉(zhuǎn)了匹配數(shù)量的值使其不是默認(rèn)的重復(fù),而變成在后面跟上“?”才變得重復(fù).這和 Perl 不兼容.也可以通過在模式之中設(shè)定 (?U) 修正符或者在數(shù)量符之后跟一個(gè)問號(hào)(如 .*?)來啟用此選項(xiàng).
X(PCRE_EXTRA)
此修正符啟用了一個(gè) PCRE 中與 Perl 不兼容的額外功能.模式中的任何反斜線后面跟上一個(gè)沒有特殊意義的字母導(dǎo)致一個(gè)錯(cuò)誤,從而保留此組合以備將來擴(kuò)充.默認(rèn)情況下,和 Perl 一樣,一個(gè)反斜線后面跟一個(gè)沒有特殊意義的字母被當(dāng)成該字母本身.當(dāng)前沒有其它特性受此修正符控制.
u(PCRE_UTF8)
此修正符啟用了一個(gè) PCRE 中與 Perl 不兼容的額外功能.模式字符串被當(dāng)成 UTF-8.本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用.自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性.
PHP正則表達(dá)式的基本語法:
一個(gè)正則表達(dá)式,分為三個(gè)部分:分隔符,表達(dá)式和修飾符.
分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/".表達(dá)式由一些特殊字符(特殊字符詳見下面)和非特殊的字符串組成,比如"[a-z0-9_-]+@[a-z0-9_-.]+"可以匹配一個(gè)簡單的電子郵件字符串.修飾符是用來開啟或者關(guān)閉某種功能/模式.下面就是一個(gè)完整的正則表達(dá)式的例子:
/hello.+?hello/is 上面的正則表達(dá)式"/"就是分隔符,兩個(gè)"/"之間的就是表達(dá)式,第二個(gè)"/"后面的字符串"is"就是修飾符.
在表達(dá)式中如果含有分隔符,那么就需要使用轉(zhuǎn)義符號(hào)"",比如"/hello.+?/hello/is".轉(zhuǎn)義符號(hào)除了用于分隔符外還可以執(zhí)行特殊字符,全部由字母構(gòu)成的特殊字符都需要""來轉(zhuǎn)義,比如"d"代表全體數(shù)字.
新聞熱點(diǎn)
疑難解答