PHP正則表達式,看這一篇就夠啦!

前言

不知道大家有沒有這個感受,看正則表達式就像看天文數字同樣,什麼電話號碼、郵箱的正則表達式,上網複製一下粘貼下來就搞定了。徹底不知道這寫的是什麼玩意。後來我本身也想學一下,由於感受用處仍是挺大的。看了看視頻,額...真**簡單。這裏的話若是想看視頻學習的話我推薦一下慕課網這門鬼斧神工之正則表達式課程,上手真的太快了。好了,廢話很少說,開始搞事情。php

基本語法

界定符:

標識一個正則表達式的開始和結束,用'/'或'#'或'{ }',由於語法'{ }'也多是正則表達式的運算符,爲了不混淆,因此不建議使用。建議的用法以下:正則表達式

$pattern = '/[0-9]/';  //我喜歡這個,看起來比較簡潔 
$pattern = '#[0-9]#';

原子:

可見原子:Unicode編碼表中可用鍵盤輸出後肉眼可見的字符,例如:標點 ; . / ? 或者英文字母,漢字等等可見字符
不可見原子:Unicode編碼表中可用鍵盤輸出後肉眼不可見的字符,例如:換行符 \n,Tab製表符\t, 空格等等,
通常只用這三個(換行符通常和其餘字符一塊兒匹配,由於只有換行符是匹配不到的)
小提示:匹配運算符前面須要加'\' 例如:'+' 號,匹配的話須要寫出 '\+'數組

元字符

原子的篩選方式:數據結構

| 匹配兩個或者多個分支選擇
[] 匹配方括號中的任意一個原子
[^] 匹配除方括號中的原子以外的任意字符;
例子:Duang|duang 或者 [Dd]uang 均可以匹配到Duang和duang
區間寫法:[a-z]匹配a到z的字符, [0-9]匹配0到9的字符。也能夠[a-z0-9]
. 匹配除換行符以外的任意字符
\d 匹配任意一個十進制數字,即{0-9]
\D 匹配任意一個非十進制數字[^0-9] 至關於[^\d]
\s 匹配一個不可見的原子,即[\f\n\r\t\v]
\S 匹配一個可見的原子,即[^\f\n\r\t\v],至關於[^\s]z
\w 匹配任意一個數字、字母或下劃線,即[0-9a-zA-Z_]
\W 匹配任意一個非數字、字母或下劃線,[^0-9a-zA-Z_],至關於[^\w]函數

量詞

{n} 表示其前面的原子恰好出現了n次。
[n] 表示其前面的原子最少出現n次
{n,m} 最少出現n次,最多出現m次
* 匹配0次、一次或者屢次,即{0,}
+ 匹配一次或屢次,即{1,}
? 匹配0或1次,即{0,1}學習

邊界控制

^ 匹配字符串開始的位置
$ 匹配字符串結尾的位置
例:^John 能夠匹配到:John 可是匹配不到:123John,由於規定了字符串以John開頭編碼

模式單元

{} 匹配其中的總體爲一個原子code



修正模式

貪婪匹配

匹配結果存在歧義時取其長(默認)視頻

懶惰匹配

匹配結果存在歧義時取其短,只需在正則表達式的後面'/'加上'U',例如'/[0-9]/U';
例子:字符串

$subject = "test__123123123";
preg_match('/test.+123/', $subject, $matches); //貪婪模式  
var_dump($matches);
preg_match('/test.+123/U', $subject, $matches); //懶惰模式
var_dump($matches);

常見的修正模式:

U 懶惰匹配
i 忽略英文字母的大小寫
x 忽略正則表達式的空白符
s 讓元字符'.' 匹配包括換行符在內的全部字符



經常使用函數

preg_match

執行匹配正則表達式

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int

  • pattern: 要搜索的模式,字符串類型。
  • subject:輸入字符串。
  • match: 若是提供了參數matches,它將被填充爲搜索結果,數據結構爲一維數組。
  • flags: 能夠設置爲PREG_OFFSET_CAPTURE,使用搜索結果的第0個元素爲匹配的字符串,第1個元素爲對應的偏移量(位置)
  • offset: 搜索從目標字符串的起始位置開始匹配。

返回值:匹配次數
相似函數preg_match_all,參數與preg_match一致
區別:

  • preg_match:只匹配一次,搜索結構match的數據結果爲一維數組
  • preg_match_all:匹配所有,搜索結果match的數據結構爲二維數組。

preg_replace

執行一個正則表達式搜索和替換,返回值爲替換後的字符串

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

  • pattern:要搜索的模式。能夠是一個字符串或字符串數組。
  • replacement:用於替換的字符串或字符串數組
  • subject:要進行搜索和替換的字符串或字符串數組。
  • limit:替換的最大次數。默認是 -1(無限)。
  • count:替換次數。
    相似函數preg_filter,參數與preg_replace一致
    區別(使用數組進行匹配的時候纔看得出區別):
  • preg_replace:無論是否有替換,返回所有結果
  • preg_filter:只返回匹配的結果。

preg_split

經過一個正則表達式分隔字符串

preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) : array

  • $pattrn:用於搜索的模式,字符串形式。
  • subject:輸入字符串
  • limit:將限制分隔獲得的子串最多隻有limit個,返回的最後一個 子串將包含全部剩餘部分。
  • flags:有如下標記的組合:
    -- 1. PREG_SPLIT_NO_EMPTY: 返回分隔後的非空部分。
    -- 2. PREG_SPLIT_DELIM_CAPTURE: 用分隔符'()'括號把匹配的捕獲並返回。
    -- 3. PREG_SPLIT_OFFSET_CAPTURE: 匹配返回時將會附加字符串偏移量

PREG_SPLIT_DELIM_CAPTURE這個參數可能比較難明白,舉個例子看看:

$subject = "1a23b";  
$a = preg_split('/[\d]/', $subject, -1, PREG_SPLIT_NO_EMPTY);  
var_dump($a);  
$a = preg_split('/([\d])/', $subject, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
var_dump($a);

輸出以下:

array (size=2)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
array (size=5)
0 => string '1' (length=1)
1 => string 'a' (length=1)
2 => string '2' (length=1)
3 => string '3' (length=1)
4 => string 'b' (length=1)

preg_grep

返回匹配模式的數組條目

preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) : array

  • $pattern:要搜索的模式,字符串形式
  • $input:輸入數組
  • flags:若是不設置則返回匹配的數目,設置PREG_GREP_INVERT則返回不匹配的數目。

preg_quote

轉義正則表達式字符,返回爲轉義後的字符串

preg_quote ( string $str [, string $delimiter = NULL ] ) : string

  • str:輸入字符串
  • delimiter:須要轉義的字符串
相關文章
相關標籤/搜索