php正則表達式及其函數

正則表達式基礎

1. ‘^’和 $’ 表示用來匹配字符串的開始和結束。(^有兩種用法,下一種,見下面)

  • “^mtg”: 匹配以 “mtg”開頭的字符串;
  • “mtg$”: 匹配以 “mtg” 結尾的字符串;
  • “^mtg$”: 匹配以mtg開頭和以mtg結尾的字符串,實際上是隻有abc與之匹配

2. ‘*’表示0次或者多次,‘+’表示1次或多次,‘?’表示0次或1次

  • “ab*”: 匹配字符串a和0個或者多個b組成的字符串
  • “ab*”: 匹配字符串a和1個或者多個b組成的字符串
  • “ab?”: 匹配字符串a和0個或者1個b組成的字符串

3. 大括號裏面控制字符出現的個數

  • “ab{2}”: 匹配一個a後面只跟兩個b;
  • “a(bc){2,}”: 匹配一個a至少跟兩個bc;
  • “ab{3,5}”: 匹配一個a跟3到5個b”.

4.字符 ‘│’, 相當於OR 操作

  • “(a│bc)de”: 匹配含有 “ade” 或者 “bcde”的字符串;

5.一個點’.’可以代表除換行符之外的任意單個字符,中括號括住的內容只匹配一個單一的字符

  • “a.[0-9]”: 匹配一個a跟一個字符再跟一個數字

如果需要匹配包含換行符在內的任意字符

"([\s\S]*)" 或"([\d\D]*)" 或"([\w\W]*)" 來表示。

6.[^x]:匹配除了 x 意外的任意字符

  • “[^x]*”: 表示匹配除x外的任意字符

7.常用的元字符

  • “\w”: 匹配字母或數字或下劃線
  • “\W”: \w的反義,即匹配任意非字母,數字,下劃線和漢字的字符
  • “\d”: 匹配數字
  • “\D”: \d的反義,即匹配任意非數字的字符
  • “\s”: 匹配任意的空白符
  • “\S”: \s的反義,即匹配任意非空白符的字符
  • “\b”: 匹配單詞的開始或結束
  • “\B”: \b的反義,即不是單詞開頭或結束的位置
    下面的代碼是對\b的用法的實例,preg_match_all()函數下面將介紹:
$str="hi history";
preg_match_all("/\bhi\b/",$str,$arr);
preg_match_all("/hi/",$str,$arr1);
var_dump($arr);
var_dump($arr1);

輸出爲:


array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(2) "hi"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(2) "hi"
    [1]=>
    string(2) "hi"
  }
}

即”\b”只匹配單個的單詞

8.正則表達式中需要轉義的特殊字符:

* . ? + $ ^ [ ] ( ) { } | \ / " " 

如[,如果需要轉義使用 \[;
下面的代碼是關於\[的使用代碼:

$str="[123]";
preg_match_all("/\[([^\]]*)\]/",$str,$arr);//更簡單的正則式爲
"/\[(.*)\[/"

var_dump($arr);

輸出爲

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(5) "[123]"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "123"
  }
}

9.preg_match()函數:

函數原型:
int preg_match( string pattern, string subject [, array matches ] )成功返回 1 ,否則返回 0 。

參數:

  • pattern 正則表達式
  • subject 需要匹配檢索的對象
  • matches 可選,存儲匹配結果的數組, matches[0] matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文本,以此類推

提示:preg_match() 第一次匹配成功後就會停止匹配,如果要實現全部結果的匹配,即搜索到subject結尾處,則需使用 preg_match_all() 函數。
例如:

$str=" aabab ";
preg_match("/a.*?b/",$str,$arr);

var_dump($arr);

輸出爲


array(1) {
  [0]=>
  string(3) "aab"
}

10.preg_match_all()函數:

函數原型:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
成功返回整個模式匹配的次數(可能爲零),如果出錯返回 FALSE 。
參數:

  • pattern 正則表達式
  • subject 需要匹配檢索的對象
  • matches 存儲匹配結果的數組
  • flags
    可選,指定匹配結果放入 matches 中的順序,可供選擇的標記有:
    1. PREG_PATTERN_ORDER:默認,對結果排序使 matches[0] matches[1] 爲第一個括號中的子模式所匹配的字符串組成的數組,以此類推
    2. PREG_SET_ORDER:對結果排序使 matches[0] matches[1] 爲第二組匹配項的數組,以此類推
    3. PREG_OFFSET_CAPTURE:如果設定本標記,對每個出現的匹配結果也同時返回其附屬的字符串偏移量
$str=" <p>abcde</p> <p>fghij</p> ";
preg_match_all("/<p>(.*?)<\/p>/",$str,$arr);

var_dump($arr);
array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(12) "<p>abcde</p>"
    [1]=>
    string(12) "<p>fghij</p>"
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "abcde"
    [1]=>
    string(5) "fghij"
  }
}

11.模式修正符的使用

這裏寫圖片描述

12.貪婪模式(儘可能的匹配更多內容)和非貪婪模式(儘可能的匹配更少的內容)

如字符串aabab:

  • 貪婪模式:pattern爲”/a.*b/”匹配的結果爲aabab。
  • 非貪婪模式: pattern爲”/a.*?b/”匹配的結果爲aab和ab

13.向後引用

定義:當用“()”定義了一個正則表達式組後,正則引擎則會把被匹配的組按照順序編號,存入緩存。當對被匹配的組進行向後引用的時候,可以用“\數字”的方式進行引用。”\1“引用第一個匹配的後向引用組,”\2”引用第二個組,以此類推,”\n”引用第n個組。而”\0”則引用整個被匹配的正則表達式本身。我們看一個例子。
假設你想匹配一個HTML標籤的開始標籤和結束標籤,以及標籤中間的文本。例如

<B>This is a test</B>

則pattern爲

<(.*)>.*<\/\1>

14.常用正則表達式

  1. E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
  2. 2.URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
  3. 郵政編碼:^[1-9]\d{5}$
  4. 手機號碼:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
  5. 匹配HTML標記:<(.*)>.*<\/\1>|<(.*) \/>
  6. 提取信息中的圖片鏈接:(s|S)(r|R)(c|C) *= *('|")?(\w|\|\/|\.)+('|"| *|>)?
  7. 提取信息中的中國手機號碼:(86)*0*13\d{9}
  8. 提取信息中的中國固定電話號碼:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
  9. 騰訊QQ號:`^[1-9]*[1-9][0-9]*$
  10. 千里碼的一道題:寫一個正則表達式來匹配這些符合要求的身份證號(出生年份在1985-1995的男性用戶):^[\d]{6}19(8[5-9]|9[0-5])[\d]{6}[013579][0-9xX]$
發佈了40 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章