首頁  >  文章  >  後端開發  >  PHP—PCRE正規表示式轉義序列(反斜線)

PHP—PCRE正規表示式轉義序列(反斜線)

伊谢尔伦
伊谢尔伦原創
2016-11-21 17:26:381360瀏覽

反斜線有多種用法。首先,如果緊接著是一個非字母數字字符,表示取消 該字符所代表的特殊涵義。這種將反斜線作為轉義字元的用法在字元類別 內部和外部都可用。

例如,如果你希望匹配一個 "*" 字符,就需要在模式中寫為 "*"。 這適用於一個字元在不進行轉義會有特殊意義的情況下。 但是, 對於非數字字母的字符,總是在需要其進行原文匹配的時候在它前面增加一個反斜線, 來聲明它代表自己,這是安全的。如果要符合一個反斜線,那麼在模式中使用 ”\”。

Note:

反斜線在單引號字串和雙引號字串 中都有特殊意義,因此要符合一個反斜線, 模式中必須寫為 ”\\」。 譯註: “/\/”, 首先它作為字串,反斜線會進行轉義, 那麼轉義後的結果是//,這個才是正則表達式引擎拿到的模式, 而正則表達式引擎也認為是轉義標記,它會將分隔符號/ 進行轉義, 從而得到的是一個錯誤,因此,需要4 個反斜線才可以匹配一個反斜線。

如果一個模式被使用 PCRE_EXTENDED 選項編譯,模式中的空白字元(除了字元類別中的)和未轉義的#到行末的所有字元都會被忽略。 要在這種情況下使用空白字元或#,就需要對其進行轉義。

反斜線的第二種用途提供了一種對非列印字元進行可見編碼的控製手段。 除了二進制的0 會終結一個模式外,並不會嚴格的限制非打印字符(自身)的出現, 但是當一個模式以文本編輯器的方式編輯準備的時候, 使用下面的轉義序列相比使用二進制字元會更加容易。

a

響鈴字符(十六進位07)

cx

"control-x",x 是任意字元

e

轉義(十六進位1B)

e

轉義(十六進位1B)頁(十六進位0C)

n

換行(十六進位0A)

p{xx}

一個符合xx 屬性的字元

P{xx}

一個符合xx 屬性的字元

P{xx}

一個符合xx 屬性的字元

r

回車(十六進位0D)

t

水平製表符(十六進位09)

xhh

編碼的字符,或後向引用

cx的確切效果如下: 如果x是一個小寫字母,它被轉換為大寫。接著, 將字元的第6位(十六進位 40,右數第一個位元為第0位)取反。 例如cz成為十六進位的1A,c{成為十六進位3B, c;成為十六進位7B。

在”x」後面,讀取兩個十六進制數(字母可以是大寫或小寫)。 在UTF-8模式,「x{…}」允許使用, 花括號內的內容是十六進位有效數字。 它將給出的十六進制數字解釋為 UTF-8 字元代碼。原來的十六進制轉義序列, xhh, 匹配一個雙字節的UTF-8字符,如果它的值大於127

在”

任意非水平空白字元(since PHP 5.2.4)

s

任意空白字元

S

任意非空白字元

v

任意垂直空白字(V)(Vsin44).

任意非垂直空白字元(since PHP 5.2.4)

w

任意單字字元

W

任意非單字字元

上面每一對轉義序列都代表了完整字符集中兩個不相交的完整字符集中的兩個不相交。部分, 任意字元一定會符合其中一個,同時一定不會符合另一個。

單字字元指的是任意字母、數字、底線。 也就是說任意可以組成perl單字的字元。 字母和數字的定義透過PCRE字元表控制,可以透過指定地域設定使其匹配改變。例如, 在法國 (fr) 地域設定中,一些超過 128 的字元代碼被用於重音字母, 它們可以實用 w 匹配。

這些字元類別序列在字元類別內部或外部都可以出現。 他們每次匹配所代表的字元類型中的一個字元。 如果當前匹配點位於目標字串末尾, 它們中的所有字元都匹配失敗, 因為沒有字元讓它們匹配了。

反斜線的第四種用法是一些簡單的斷言。 一個斷言指定一個必須在特定位置匹配的條件, 它們不會從目標字串中消耗任何字元。 接下來我們會討論使用子群組的更複雜的斷言。 反斜線斷言包括:

b

單字邊界

B

非單字邊界

A

目標的開始位置(獨立於多行模式換行符(獨立於多行模式)

z

目標的結束位置(獨立於多行模式)

G

在目標中首次匹配位置

這些斷言不能出現在字符類中(但是注意, 「b」在字元類別中有不同的意義, 表示的是退格(backspace)字元)

一個單字邊界表示的是在目標字串中, 當前字元和前一個字元不同時匹配w或W(一個比配w, 一個匹配W), 或作為字串開始或結尾字元的時候當前字元匹配w。

A, Z, z斷言不同於傳統的^和$(詳見下文), 因為他們永遠匹配目標字串的開始和結尾,而不會受模式修飾符的限制。 它們不受PCRE_MULTILINE,PCRE_DOLLAR_ENDONLY選項的影響。 Z 和 z 之間的不同在於當字串結束字元時換行符時 Z 會將其看做字串結尾匹配, 而 z 則只匹配字串結尾。

G 斷言在指定了$offset 參數的 preg_match() 呼叫中, 僅在當前匹配位置在匹配開始點的時候才是成功的。 當$offset 的值不為 0 的時候, 它與 A 是不同的。 譯註:另外一點與 A 的不同之處在於使用 preg_match_all() 時, 每次符合 G 只是斷言是否是配對結果的開始位置, 而 A 斷言的則是符合結果的起始位置是否在目標字串開始位置。

自 PHP 4.3.3開始, Q 和 E 可以用來在模式中忽略正規表示式元字元。例如: w+Q.$.E$ 會匹配一個或多個單字字符,緊接著一個點號,一個$,一個點號, 最後錨向字串末尾。

自 PHP 5.2.4 開始。 K 可以用於重置配對。 例如, footKbar 匹配”footbar」。 但是得到的匹配結果是 ”bar”。但是,K 的使用不會幹預到子組內的內容, 例如 (foot)Kbar 匹配 ”footbar”,第一個子組內的結果仍然會是 ”foo”。譯註: K 放在子組和子組外面的效果是一樣的。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn