反斜線有多種用法。首先,如果緊接着是一個非字母數字字符,表明取消 該字符所代表的特殊涵義。這種將反斜線作為轉義字符的用法在字符類 內部和外部都可用。
比如,如果你希望匹配一個 "*" 字符,就需要在模式中寫為 "\*"。 這適用於一個字符在不進行轉義會有特殊含義的情況下。 但是, 對於非數字字母的字符,總是在需要其進行原文匹配的時候在它前面增加一個反斜線, 來聲明它代表自己,這是安全的。如果要匹配一個反斜線,那么在模式中使用 ”\\”。
Note:
反斜線在單引號字符串和雙引號字符串 中都有特殊含義,因此要匹配一個反斜線, 模式中必須寫為 ”\\\\”。 譯注: “/\\/”, 首先它作為字符串,反斜線會進行轉義, 那么轉義后的結果是/\/,這個才是正則表達式引擎拿到的模式, 而正則表達式引擎也認為 \ 是轉義標記,它會將分隔符 / 進行轉義, 從而得到的是一個錯誤,因此,需要 4 個反斜線才可以匹配一個反斜線。
如果一個模式被使用 PCRE_EXTENDED 選項編譯, 模式中的空白字符(除了字符類中的)和未轉義的#到行末的所有字符都會被忽略。 要在這種情況下使用空白字符或者#,就需要對其進行轉義。
反斜線的第二種用途提供了一種對非打印字符進行可見編碼的控制手段。 除了二進制的 0 會終結一個模式外,並不會嚴格的限制非打印字符(自身)的出現, 但是當一個模式以文本編輯器的方式編輯准備的時候, 使用下面的轉義序列相比使用二進制字符會更加容易。
- \a
- 響鈴字符(十六進制 07)
- \cx
- "control-x",x 是任意字符
- \e
- 轉義 (十六進制 1B)
- \f
- 換頁 (十六進制 0C)
- \n
- 換行 (十六進制 0A)
- \p{xx}
- 一個符合 xx 屬性的字符,詳細查看unicode properties 屬性
- \P{xx}
- 一個不符合xx屬性的字符,詳細查看unicode properties 屬性
- \r
- 回車 (十六進制 0D)
- \t
- 水平制表符 (十六進制 09)
- \xhh
- hh十六進制編碼的字符,詳細查看unicode properties 屬性
- \ddd
- ddd八進制編碼的字符,或者后向引用
\cx的確切效果如下: 如果x是一個小寫字母,它被轉換為大寫。接着, 將字符的第6位(十六進制 40,右數第一個位為第0位)取反。 比如\cz成為十六進制的1A,\c{成為十六進制3B, \c;成為十六進制7B。
在”\x”后面,讀取兩個十六進制數(字母可以是大寫或小寫)。 在UTF-8模式, “\x{…}”允許使用, 花括號內的內容是十六進制有效數字。 它將給出的十六進制數字解釋為 UTF-8 字符代碼。原來的十六進制轉義序列, \xhh, 匹配一個雙字節的UTF-8字符,如果它的值大於127
在”\0”之后, 讀取兩個八進制數。所有情況下,如果數少於2個,則直接使用。 序列 ”\0\x\07” 指定了兩個二進制 0 緊跟着一個 BEL 字符。 請確保初始的 0 之后的兩個數字是合法的八進制數。
處理一個反斜線緊跟着的不是0的數字的情況比較復雜。在字符類外部, PCRE 讀取它並以十進制讀取緊隨其后的數字。 如果數值小於 10, 或者之前捕獲到了該數字能夠代表的左括號(子組), 整個數字序列被認為是后向引用。后向引用如何工作在后面描述, 接下來就會討論括號子組。
在一個字符類里面,或者十進制數大於 9 並且沒有那么多的子組被捕獲, PCRE 重新讀取反斜線后的第三個 8 進制數字,並且從最低的 8 位生成單字節值。 任何的后續數字都代表它們自身。例如:
- \040
- 空格的另外一種用法
- \40
- 當提供了少於40個子組時也認為是空格。
- \7
- 始終是后向引用
- \11
- 可能是后向引用,也可能是制表符
- \011
- 總是一個制表符
- \0113
- 一個制表符緊跟着一個3(因為每次最多只讀取3個8進制位
- \113
- 八進制113代表的字符
- \377
- 8進制377是10進制255, 因此代表一個全1的字符
- \81
- 一個后向引用或者一個二進制 0 緊跟着兩個數字 8 和 1(因為8不是8進制有效數字)
注意,八進制值的 100 或者更大的值必須沒有前置的0引導, 因為每次最多讀取3個8進制位.
所有序列定義的單字節值都可以在字符類內部或外部使用。另外,在字符類中, 序列 ”\b” 解釋為退格字符。字符類外它又有不同的意義(下面有描述)
反斜線的第三種用法是用來描述特定的字符類:
- \d
- 任意十進制數字
- \D
- 任意非十進制數字
- \h
- 任意水平空白字符(since PHP 5.2.4)
- \H
- 任意非水平空白字符(since PHP 5.2.4)
- \s
- 任意空白字符
- \S
- 任意非空白字符
- \v
- 任意垂直空白字符(since PHP 5.2.4)
- \V
- 任意非垂直空白字符(since PHP 5.2.4)
- \w
- 任意單詞字符
- \W
- 任意非單詞字符
上面每一對轉義序列都代表了完整字符集中兩個不相交的部分, 任意字符一定會匹配其中一個,同時一定不會匹配另外一個。
單詞字符指的是任意字母、數字、下划線。 也就是說任意可以組成perl單詞的字符。 字母和數字的定義通過PCRE字符表控制,可以通過指定地域設置使其匹配改變。比如, 在法國 (fr) 地域設置中,一些超過 128 的字符代碼被用於重音字母, 它們可以實用 \w 匹配。
這些字符類序列在字符類內部或外部都可以出現。 他們每次匹配所代表的字符類型中的一個字符。 如果當前匹配點位於目標字符串末尾, 它們中的所有字符都匹配失敗, 因為沒有字符讓它們匹配了。
反斜線的第四種用法是一些簡單的斷言。 一個斷言指定一個必須在特定位置匹配的條件, 它們不會從目標字符串中消耗任何字符。 接下來我們會討論使用子組的更加復雜的斷言。 反斜線斷言包括:
- \b
- 單詞邊界
- \B
- 非單詞邊界
- \A
- 目標的開始位置(獨立於多行模式)
- \Z
- 目標的結束位置或結束處的換行符(獨立於多行模式)
- \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 可以用於重置匹配。 比如, foot\Kbar 匹配”footbar”。 但是得到的匹配結果是 ”bar”。但是, \K 的使用不會干預到子組內的內容, 比如 (foot)\Kbar 匹配 ”footbar”,第一個子組內的結果仍然會是 ”foo”。譯注: \K 放在子組和子組外面的效果是一樣的。