----- 最近更新【2021-12-15】-----
一、簡介
正則表達(dá)式是一種描述字符串結(jié)果的語法規(guī)則,是一個(gè)特定的格式化模式盈咳,可以匹配圃伶、替換怜校、截取匹配的字符串胎围。
二、語法
當(dāng)使用 PCRE 函數(shù)的時(shí)候药版,模式需要由分隔符閉合包裹辑舷。分隔符可以使任意非字母數(shù)字喻犁、非反斜線槽片、非空白字符。經(jīng)常使用的分隔符是正斜線(/)肢础、hash符號(hào)(#) 以及取反符號(hào)(~)还栓。
合法模式示例:
/<\/\w+>/
#^[^0-9]$#
|(\d{3})-\d+|Sm ## 可以在結(jié)束分隔符后面增加模式修飾符
/^(?i)php[34]/
{^\s+(\s+)?$} ## 括號(hào)樣式的分隔符,左括號(hào)和右括號(hào)分別作為 開始和結(jié)束 分隔符传轰。
%[a-zA-Z0-9_-]%
非法模式示例:
/href='(.*)' ## 缺失結(jié)束分隔符
/\w+\s*\w+/J ## 未知模式修飾符"J"
1-\d3-\d3-\d4| ## 缺失開始分隔符
如果分隔符需要在模式內(nèi)進(jìn)行匹配剩盒,它必須使用反斜線進(jìn)行轉(zhuǎn)義。如果分隔符經(jīng)常在 模式內(nèi)出現(xiàn)慨蛙, 一個(gè)更好的選擇就是是用其他分隔符來提高可讀性辽聊。
/http:\/\//
#http://#
三、正則表達(dá)式
由上面介紹的合法分隔符所包含的部分期贫,就是我們主要去了解的正則表達(dá)式部分了跟匆。下面我將對(duì)一些常用的部分做一下歸類:
1、 原子
原子是組成正則表達(dá)式的基本單位通砍,在分析正則表達(dá)式時(shí)玛臂,應(yīng)作為一個(gè)整體。
包括以下內(nèi)容:
> 單個(gè)字符封孙、數(shù)字迹冤,如a-z,A-Z虎忌,0-9泡徙。
> 模式單元,如(ABC)可以理解為由多個(gè)原子組成的大的原子膜蠢。
> 原子表锋勺,如 [ABC]蚀瘸。
> 重新使用的模式單元,如:\1
> 普通轉(zhuǎn)義字符庶橱,如:\d贮勃, \D, \w
> 轉(zhuǎn)義元字符苏章,如:\*寂嘉,\.
> 元字符
2、元字符
- ^ 斷言目標(biāo)的開始位置(或在多行模式下是行首)
- $ 斷言目標(biāo)的結(jié)束位置(或在多行模式下是行尾)
- . 表示任意一個(gè)除換行符之外的字符
- [] 表示單個(gè)字符的原子表
[^] 表示除中括號(hào)內(nèi)原子之外的任何字符 是[]的取反
[-] 表示允許的范圍枫绅,如[0-9]表示任意一位數(shù)字 - {m} 表示對(duì)前面原子的數(shù)量控制泉孩,表示是m次
{m,} 表示對(duì)前面原子的數(shù)量控制,表示是至少m次
{m,n}表示對(duì)前面原子的數(shù)量控制并淋,表示是m到n次 - * 量詞寓搬,0 次或多次匹配,等價(jià)于{0,}
- + 量詞县耽,1 次或多次匹配句喷,等價(jià)于{1,}
- ? 作為量詞,表示 0 次或 1 次匹配兔毙,等價(jià)于{0,1} 唾琼。位于量詞后面用于改變量詞的貪婪特性。
- () 表示一個(gè)整體原子澎剥,【還有一個(gè)子存儲(chǔ)單元的作用】锡溯。 也可以使用
?:
來拒絕子存儲(chǔ)。 (?:.*?) - | 開始一個(gè)可選分支
3哑姚、常用轉(zhuǎn)義字符
說明 | |
---|---|
\d | 匹配一個(gè)數(shù)字祭饭;等價(jià)于[0-9] |
\D | 匹配除數(shù)字以外任何一個(gè)字符;等價(jià)于[^0-9] |
\w | 匹配一個(gè)英文字母叙量、數(shù)字或下劃線倡蝙;等價(jià)于[0-9a-zA-Z_] |
\W | 匹配除英文字母、數(shù)字和下劃線以外任何一個(gè)字符宛乃;等價(jià)于[^0-9a-zA-Z_] |
\s | 匹配一個(gè)空白字符悠咱;等價(jià)于[\f\n\r\t\v] |
\S | 匹配除空白字符以外任何一個(gè)字符;等價(jià)于[^\f\n\r\t\v] |
\n | 匹配一個(gè)換行符 |
\r | 匹配一個(gè)回車符 |
4征炼、模式修整符
- i 表示不區(qū)分大小寫析既;
如:"/[a-zA-Z]/"
等價(jià)于"/[a-z]/i"
- s 表示匹配視為單行
如果設(shè)置了這個(gè)修飾符,模式中的點(diǎn)號(hào)元字符匹配所有字符谆奥,包含換行符眼坏。如果沒有這個(gè) 修飾符,點(diǎn)號(hào)不匹配換行符。 - U 表示拒絕貪婪匹配
通過量詞后緊跟? 的方式可以使其成為貪婪的宰译,注意這和 模式修整符U 是不能同時(shí)使用的檐蚜,只能取其一。 - x 忽略空白字符
5沿侈、惰性匹配
函數(shù)符 | 描述 |
---|---|
*? | 零次或多次闯第,但盡可能少的匹配 |
+? | 一次或多次,但盡可能少的匹配 |
?? | 0次或1次缀拭,但盡可能少的匹配 |
{n,}? | 至少n次咳短,但盡可能少的匹配 |
{n,m}? | n到m次 ,但盡可能少的匹配 |
四蛛淋、相關(guān)函數(shù)
1咙好、preg_match
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject與pattern給定的正則表達(dá)式的一個(gè)匹配。
如果提供了參數(shù)matches褐荷,它將被填充為搜索結(jié)果勾效。 $matches[0]將包含完整模式匹配到的文本, $matches[1] 將包含第一個(gè)捕獲子組匹配到的文本叛甫,以此類推层宫。
函數(shù)返回值為0或1。
如:
$label = 'content/112abc';
$a = preg_match('#content/(\d+)(\w*)#i', $label, $mc);
var_dump($a);
var_dump($mc);
結(jié)果:
int(1)
array(3) {
[0] =>
string(14) "content/112abc"
[1] =>
string(3) "112"
[2] =>
string(3) "abc"
}
注意:
preg_match() 第一次匹配成功后就會(huì)停止匹配合溺,如果要實(shí)現(xiàn)全部結(jié)果的匹配卒密,即搜索到subject結(jié)尾處缀台,則需使用preg_match_all() 函數(shù)棠赛。
2、preg_match_all
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜索subject中所有匹配pattern給定正則表達(dá)式 的匹配結(jié)果并且將它們以flag指定順序輸出到matches中膛腐。在第一個(gè)匹配找到后, 子序列繼續(xù)從最后一次匹配位置搜索睛约。
該函數(shù)返回完整匹配次數(shù)(可能是0),或者如果發(fā)生錯(cuò)誤返回FALSE哲身。
參數(shù)說明:
參數(shù) | 說明 |
---|---|
pattern | 正則表達(dá)式 |
subject | 需要匹配檢索的對(duì)象 |
matches | 存儲(chǔ)匹配結(jié)果的數(shù)組 |
flags | 可選辩涝,指定匹配結(jié)果放入 matches 中的順序,可供選擇的標(biāo)記有: 1)PREG_PATTERN_ORDER:默認(rèn)勘天,對(duì)結(jié)果排序使 $matches[0] 為全部模式匹配的數(shù)組怔揩,$matches[1] 為第一個(gè)括號(hào)中的子模式所匹配的字符串組成的數(shù)組,以此類推 2)PREG_SET_ORDER:對(duì)結(jié)果排序使 $matches[0] 為第一組匹配項(xiàng)的數(shù)組脯丝,$matches[1] 為第二組匹配項(xiàng)的數(shù)組商膊,以此類推 3)PREG_OFFSET_CAPTURE:如果設(shè)定本標(biāo)記,對(duì)每個(gè)出現(xiàn)的匹配結(jié)果也同時(shí)返回其附屬的字符串偏移量 |
如:
$userinfo = "Name: <b>PHP</b> <br> Title: <b>Programming Language</b>";
preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array);
print_r($pat_array[0]);
結(jié)果:
Array
(
[0] => <b>PHP</b>
[1] => <b>Programming Language</b>
)
3宠进、preg_replace
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分晕拆, 以replacement進(jìn)行替換。
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
//輸出:April1,2003
4材蹬、preg_split
通過一個(gè)正則表達(dá)式分隔給定字符串.
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
如:
//使用逗號(hào)或空格(包含" ", \r, \t, \n, \f)分隔短語
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
結(jié)果:
Array
(
[0] => hypertext
[1] => language
[2] => programming
)
5实幕、其它
1)preg_grep
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回給定數(shù)組input中與模式pattern 匹配的元素組成的數(shù)組
2)preg_quote
string preg_quote ( string $str [, string $delimiter = NULL ] )
轉(zhuǎn)義正則表達(dá)式字符
五吝镣、經(jīng)典實(shí)例
1、關(guān)于URL
1)從url中取得主機(jī)名
$url = "http://blog.nosee123.com/index.php";
preg_match("/^(http:\/\/)?([^\/]+)/i",$url, $matches);
$host = $matches[2];
echo $host; // 結(jié)果為:string(15) "blog.nosee123.com"
2)判斷字符串是否為url
/^http(s?):\/\/([\w]+\.?)++\/*[\w\.]*\??[\w=&\+\%]*/is
2昆庇、關(guān)于Email
1)判斷字符串是否是郵箱
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9]+\.[a-zA-Z0-9\.]+$
2)只允許英文字母末贾、數(shù)字、下劃線整吆、英文句號(hào)未舟、以及中劃線組成
//gaozihang-001@gmail.com
^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
3、關(guān)于字符
1)任意一位大小字母或數(shù)字下劃線:
[A-Za-z0-9_] 等價(jià)于 \w
4掂为、數(shù)字相關(guān)
1)手機(jī)號(hào)碼
[1][3-8][0-9]{9} //粗略匹配
^((13[0-9])|147|(15[0-35-9])|180|182|(18[5-9]))[0-9]{8}$
Or:
# 中國大陸手機(jī)號(hào) (移動(dòng)/聯(lián)通/電信):
/^1(3[0-9]|4[5-9]|5[0-35-9]|66|7[013-8]|8[0-9]|9[89])\d{8}$/
# 中國移動(dòng):
/^1(34[0-8]|3[5-9\d]|440|4[78]\d|5[0-27-9]\d|70[356]|78\d|8[2-478]\d|98\d)\d{7}$/
# 中國聯(lián)通:
/^1(3[0-2]\d|4[56]\d|5[56]\d|66\d|70[4789]|71|7[56]\d|8[56]\d)\d{7}$/
# 中國電信:
/^1(3[3]\d|349|410|49\d|53\d|70[0-2]|7[37]\d|740|8[019]\d|99\d)\d{7}$/
2)ip地址
\d+\.\d+\.\d+\.\d+
3)身份證
^(([0-9]{15})|([0-9]{18})|([0-9]{17}x))$
5裕膀、中文匹配
中文匹配:UTF-8漢字編碼范圍是0x4e00-0x9fa5;在ANSI(gb2312)環(huán)境下勇哗,0xb0-0xf7昼扛,0xa1-0xfe。
UTF-8要使用u模式修正符使模式字符串被當(dāng)成UTF-8欲诺,在ANSI(gb2312環(huán)境下)抄谐,使用chr將Ascii碼轉(zhuǎn)換為字符。
[\x{4e00}-\x{9fa5}] #utf-8中文
[\u4e00-\u9fa5] #通用
5扰法、HTML頁面的匹配
1)取出頁面中所有img標(biāo)簽的src值
'/<img.*?src=("|\')(.*?)("|\').*?\/?>/i'
2)判斷是否為a鏈接
/<a .*?href="(.*?)".*?>/is