正則表達式是一個從左到右匹配目標字符串的模式。大多數字符自身就代表一個匹配 它們自身的模式。
1.分隔符:當使用 PCRE 函數的時候,模式需要由分隔符閉合包裹。分隔符可以使任意非字母數字、非反斜線、非空白字符。
經常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~)。下面的例子都是使用合法分隔符的模式。
/foo bar/ #^[^0-9]$# +php+ %[a-zA-Z0-9_-]%
如果分隔符需要在模式內進行匹配,它必須使用反斜線(\)進行轉義。如果分隔符經常在 模式內出現, 一個更好的選擇就是是用其他分隔符來提高可讀性。
/http:\/\//
#http://#
需要將一個字符串放入模式中使用時,可以用 preg_quote() 函數對其進行 轉義,它的第二個參數(可選)可以用於指定需要被轉義的分隔符。
除了上面提到的分隔符,也可以使用括號樣式的分隔符,左括號和右括號分別作為開始和結束 分隔符。
{this is a pattern}
可以在結束分隔符后面增加模式修飾符。 下面的例子是一個大小寫不敏感的匹配:
#[a-z]#i
2.元字符
正則表達式的威力源於它可以在模式中擁有選擇和重復的能力。 一些字符被賦予 特殊的涵義,使其不再單純的代表自己,模式中的這種有特殊涵義的編碼字符 稱為 元字符.
共有兩種不同的元字符:一種是可以在模式中方括號外任何地方使用的,另外一種 是需要在方括號內使用的。
在方括號外使用的元字符如下:
- \ 一般用於轉義字符
- ^ 斷言目標的開始位置(或在多行模式下是行首)
- $ 斷言目標的結束位置(或在多行模式下是行尾)
- . 匹配除換行符外的任何字符(默認)
- [ 開始字符類定義
- ] 結束字符類定義
- | 開始一個可選分支
- ( 子組的開始標記
- ) 子組的結束標記
- ? 作為量詞,表示 0 次或 1 次匹配。位於量詞后面用於改變量詞的貪婪特性。 (查閱量詞)
- * 量詞,0 次或多次匹配
- + 量詞,1 次或多次匹配
- { 自定義量詞開始標記
- } 自定義量詞結束標記
模式中方括號內的部分稱為“字符類”。 在一個字符類中僅有以下可用元字符:
- \ 轉義字符
- ^ 僅在作為第一個字符(方括號內)時,表明字符類取反
- - 標記字符范圍
3.轉義序列(反斜線)
反斜線有多種用法。首先,如果緊接着是一個非字母數字字符,表明取消 該字符所代表的特殊涵義。這種將反斜線作為轉義字符的用法在字符類 內部和外部都可用。
比如,如果你希望匹配一個 "*" 字符,就需要在模式中寫為 "\*"。 這適用於一個字符在不進行轉義會有特殊含義的情況下。 但是, 對於非數字字母的字符,總是在需要其進行原文匹配的時候在它前面增加一個反斜線, 來聲明它代表自己,這是安全的。如果要匹配一個反斜線,那么在模式中使用 ”\\”。
Note:
反斜線在單引號字符串和雙引號字符串 中都有特殊含義,因此要匹配一個反斜線, 模式中必須寫為 ”\\\\”。 譯注: “/\\/”, 首先它作為字符串,反斜線會進行轉義, 那么轉義后的結果是/\/,這個才是正則表達式引擎拿到的模式, 而正則表達式引擎也認為 \ 是轉義標記,它會將分隔符 / 進行轉義, 從而得到的是一個錯誤,因此,需要 4 個反斜線才可以匹配一個反斜線。
4.錨