前言
本系列文章主要是根據實戰視頻《360大牛:全面解讀PHP面試》學習過程中記錄的學習筆記,期間也會加入查找資料和平時學習中學習到的知識。
作用
正則表達式的作用:分割、查找、匹配、替換字符串。
分隔符
正斜線(/)、hash符號(#)以及取反符號(~)
通用原子
\d 0-9
\D 除了0-9
\w 數字(0-9)字母(a-zA-Z)下劃線(_)
\W 除了數字(0-9)字母(a-zA-Z)下劃線(_)
\s 空白符
\S 除了空白符
元字符
. 匹配除換行符(\n、\r)之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用像"(.|\n)"的模式。
* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
? 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價於 {0,1}。
^ 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。
$ 匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
+ 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
[] 字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
() 匹配 pattern 並獲取這一匹配。
[^] 負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。
| 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[-] 字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字符。
模式修正符
i 不區分大小寫的匹配。
如:"/abc/i"可以與abc或aBC或ABc等匹配。
m 將字符串視爲多行,不管是那行都能匹配。
模式爲:$mode="/abc/m";
要匹配的字符串爲:$str="bcefg5e\nabcdfe"
注意其中\n,換行了;abc換到了下一行;
$str和$mode仍可以匹配,修正符m使得多行也可匹配。
e 正則表達式必須使用在preg_replace替換字符串的函數中時纔可以使用;可以把匹配來的字符串當作正則表達式執行;preg_replace() 函數在替換字符串中對逆向引用作正常的替換,將其作爲 PHP 代碼求值,並用其結果來替換所搜索的字符串。
s 如果沒有使用這個模式修正符號,元字符中的"."默認不能表示換行符號。s將字符串視爲單行,換行符作爲普通字符。
模式爲:$mode="/pr.y/";
要匹配字符串爲:$str="pr\ny";
兩者不可匹配; . 是除了換行以外的字符可匹配;
修改下模式爲:$mode="/pr.y/s";
其中修正符s將\n視爲普通字符,即不是換行;
最後兩者可以匹配。
U 正則表達式的特點:就是比較“貪婪”,使用該模式修正符可以取消貪婪模式。
如模式爲:
$mode="/a.*c/";
$str="abcabbbcabbbbbc" ;
preg_match($mode,$str,$content);
echo $content[0]; //輸出:abcabbbcabbbbbc;
如果$mode="/a.*c/";變成$mode="/a.*c/U";
則只匹配最近一個字符串,輸出:abc;
x 表示模式中的空白忽略不計。
A 強制從目標字符串開頭匹配;以模式字符串開頭,相當於元字符^。
可以與$str="abcsdfi"匹配,
不可以與$str2="sdsdabc"匹配;
因爲$str2不是以abc開頭;
D 如果使用$限制結尾字符,則不允許結尾有換行。
模式爲:$mode="/abc$/";
可以與最後有換行的$str="adshabc\n"匹配;
元子符$會忽略最後的換行\n;
如果模式爲:$mode="/abc/D",
則不能與$str="adshabc\n"匹配,
u 模式字符串被當成 UTF-8。
g 表示全局匹配。
難點考點(待補充)
後向引用、貪婪模式
正則表達式PCRE函數
preg_match() 執行匹配正則表達式
語法:int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject與pattern給定的正則表達式的一個匹配。
matches
如果提供了參數matches,它將被填充爲搜索結果。 $matches[0]將包含完整模式匹配到的文本, $matches[1] 將包含第一個捕獲子組匹配到的文本,以此類推。
例子:
<?php
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);
print_r($matches); //Array ( [0] => Array ( [0] => foobarbaz [1] => 0 ) [1] => Array ( [0] => foo [1] => 0 ) [2] => Array ( [0] => bar [1] => 3 ) [3] => Array ( [0] => baz [1] => 6 ) )
preg_match_all() 執行一個全局正則表達式匹配
語法:int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜索subject中所有匹配pattern給定正則表達式 的匹配結果並且將它們以flag指定順序輸出到matches中。
在第一個匹配找到後, 子序列繼續從最後一次匹配位置搜索。
preg_replace() 執行一個正則表達式的搜索和替換
語法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement進行替換。
preg_split() 通過一個正則表達式分隔字符串
語法:array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通過一個正則表達式分隔給定字符串.
例子:
<?php
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords); //Array ( [0] => hypertext [1] => language [2] => programming )
中文匹配
UTF-8漢字編碼範圍是0x4e00-0x9fa5,在ANSI(gb2312)環境下,0xb0-0xf7,0xa1-0xfe 。
UTF-8要使用u模式修正符是模式字符串被當成UTF-8,在ANSI(gb2312)環境下,要使用chr將ASCII碼轉換成字符。
參考鏈接:
https://www.cnblogs.com/yuanwanli/p/5838918.html
https://blog.csdn.net/helen_shw/article/details/56011213
http://www.runoob.com/regexp/regexp-metachar.html