PHP 正則表達式

對於任何有過編程經驗的人來講,他對正則表達式應該不會感到陌生。php

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。正則表達式

平時沒有系統地學習過正則表達式的知識,多數狀況都是在使用到時,纔會查找相關的語法來實現需求。最近對 PHP 的正則表達式進行了一次主題閱讀,收穫良多,特地寫篇筆記記錄下來。express

PHP 對正則表達式的支持

PHP 中有兩種類型的函數來處理正則表達式,一種是由 PCRE 庫提供的函數,它們是以 preg_ 前綴開頭的;另外一種是 由 POSIX 擴展提供的函數,它們是以 ereg_ 前綴開頭。可是從 PHP5.3.0 開始後者便再也不建議使用,故而如下的知識都是針對 PCRE 模式的。編程

PHP 正則表達式的組成部分

PHP 中的正則表達式由如下三部分組成:函數

  • 分隔符
  • 表達式
  • 修飾符

例如:學習

/[a-zA-Z0-9-_]+/m

上面的例子當中:
字符串收尾的 / 屬於正則表達式的分隔符,它能夠是任意的非字母數字、非反斜線、非空白字符;
分隔符中間部分 [a-zA-Z0-9-_]+ 屬於正則表達式的表達式;
正則表達式最後的部分 m 是修飾符,這裏的 m 表示多行選擇。測試

元字符

正則表達式的威力源於它能夠在模式中擁有選擇和重複的能力。 一些字符被賦予 特殊的涵義,使其再也不單純的表明本身,模式中的這種有特殊涵義的編碼字符 稱爲 元字符。編碼

元字符 含義
\ 通常用於轉義字符
^ 斷言目標的開始位置(或在多行模式下是行首)
$ 斷言目標的結束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認)
[ 開始字符類定義
] 結束字符類定義
| 開始一個可選分支
( 子組的開始標記
) 子組的結束標記
? 做爲量詞,表示 0 次或 1 次匹配。位於量詞後面用於改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或屢次匹配
+ 量詞,1 次或屢次匹配
{ 自定義量詞開始標記
} 自定義量詞結束標記
正則表達式的語法
  • 字符類(方括號)

左方括號開始一個字符類的描述,並以方中括號結束。 單獨的一個右方括號沒有特殊含義。若是一個右方括號須要做爲一個字符類中的成員, 那麼能夠將它寫在字符類的首字符處(若是使用了^取反, 那麼是第二個)或者使用轉義符。
一個字符類在目標字符串中匹配一個單獨的字符; 該字符必須是字符類中定義的字符集合的其中一個, 除非使用了 ^ 對字符類取反。 .net

例如:
[\d] 匹配全部的數字
[^\d] 匹配全部的數字以外的字符code

  • 可選路徑(|)

豎線字符用於分離模式中的可選路徑。 豎線能夠在模式中出現任意多個,而且容許有空的可選路徑(匹配空字符串)。 匹配的處理從左到右嘗試每個可選路徑,而且使用第一個成功匹配的。

好比:
模式 gilbert|Sullivan 匹配 gilbert 或者 sullivan

  • 子組(子模式)

子組經過圓括號分隔界定,而且它們能夠嵌套。子組具備兩個做用:
一、 將可選分支局部化;
二、 將子組設定爲捕獲子組。

好比:
模式 cat(arcat|erpillar|) 匹配 catcataractcaterpillar 中的一個

  • 後向引用

在反斜線後面加一個大於零的數字能夠引用模式前面捕獲的內容,這叫作後向引用。
若是緊跟反斜線的數字小於 10, 它老是一個後向引用, 而且若是在模式中沒有這麼多的捕獲組會引起一個錯誤。

例如:
模式 (sens|respons)e and \1ibility 將會匹配 sense and sensibilityresponse and responsibility, 但不會匹配 sense and responsibility

  • 斷言

一個斷言就是一個對當前匹配位置以前或以後的字符的測試, 它不會實際消耗任何字符。它有兩種類型: 前瞻斷言(從當前位置向前測試)和後瞻斷言(從當前位置向後測試);每一個類型又有確定斷言和否認斷言之分。

因此共有如下四種斷言:
一、前瞻確定斷言 (?=
二、前瞻否認斷言 (?!
三、後瞻確定斷言 (?<=
四、後瞻否認斷言 (?<!

例如:
\w+(?=;) 匹配一個單詞緊跟着一個分號可是匹配結果不會包含分號
foo(?!bar) 匹配全部後面沒有緊跟 barfoo 字符串
(?<!foo)bar 用於查找任何前面不是 foobar

貪婪/懶惰匹配模式

當正則表達式中包含能接受重複的限定符時,默認的行爲是(在使整個表達式能獲得匹配的前提下)匹配儘量多的字符。這被稱爲貪婪匹配。

例如:
a.*b 來搜索 aabab 時,它會匹配整個字符串 aabab

但是咱們的需求並不是一直是要貪婪匹配的,有時候也會選擇懶惰的匹配模式。其實在量詞後面緊跟着 ? 即爲懶惰模式。*? +? {n,m}? 皆爲懶惰匹配。

例如:
a.*?b 來搜索 aabab 時,它會匹配字符串 aabab

經常使用的幾個修飾符
  • i 忽略大小寫模式
  • m 多行模式
  • s 點號通配模式
  • U 懶惰模式
  • D 結尾限制
  • u 支持 UTF-8 轉義表達
參考連接

http://php.net/manual/zh/book...
https://regex101.com/

相關文章
相關標籤/搜索