常用的php正則表達及語法註解總結

2020-07-16 10:05:50
基本語法

界定符:

標識一個正規表示式的開始和結束,用'/'或'#'或'{ }',因為語法'{ }'也可能是正規表示式的運算子,為了避免混淆,所以不建議使用。建議的用法如下:

Copy$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 匹配一個不可見的原子,即[fnrtv]
S 匹配一個可見的原子,即[fnrtv],相當於[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開頭

模式單元

() 匹配其中的整體為一個原子, 如: (X|x)iaomi , 可以匹配到 xiaomi

修正模式

貪婪匹配

匹配結果存在歧義時取其長(預設)

懶惰匹配

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

Copy$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這個引數可能比較難明白,舉個例子看看:

Copy$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:需要跳脫的字串

以上就是常用的php正則表達及語法註解總結的詳細內容,更多請關注TW511.COM其它相關文章!