摘要:規(guī)范為的縮寫(xiě),中文即兼容正則表達(dá)式,由開(kāi)發(fā)的庫(kù),為很多現(xiàn)代工具所使用,大多數(shù)編程語(yǔ)言的正則表達(dá)式也都是集成該規(guī)范。接下來(lái)本文會(huì)對(duì)規(guī)范的正則表達(dá)式作出詳細(xì)介紹。正則語(yǔ)法分隔符當(dāng)使用函數(shù)的時(shí)候,模式需要由分隔符閉合包裹。
概述
正則表達(dá)式(Regular Expression)是一種字符匹配工具,通過(guò)構(gòu)建具有特定規(guī)則的模式,和輸入字符串?dāng)?shù)據(jù)進(jìn)行比較,然后進(jìn)行匹配、分割、替換等等的相關(guān)操作。它的設(shè)計(jì)思想是用一種描述性的語(yǔ)言來(lái)給字符串定義一個(gè)規(guī)則,凡是符合規(guī)則的字符串,我們就認(rèn)為它“匹配”了。
目前有兩種不同規(guī)范的正則表達(dá)式:
POSIX 規(guī)范:在兼容 POSIX 的 UNIX 系統(tǒng)上,grep 和 egrep 之類的工具都遵循 POSIX 規(guī)范,一些數(shù)據(jù)庫(kù)系統(tǒng)中的正則表達(dá)式也匹配 POSIX 規(guī)范。
PCRE 規(guī)范:為 Perl Compatible Regular Expressions 的縮寫(xiě),中文即 Perl 兼容正則表達(dá)式,由 Philip Hazel 開(kāi)發(fā)的 Perl 庫(kù),為很多現(xiàn)代工具所使用,大多數(shù)編程語(yǔ)言的正則表達(dá)式也都是集成該規(guī)范。
針對(duì)兩種不同的正則表達(dá)式規(guī)范,PHP 提供了兩組不同的函數(shù)庫(kù),分別為 POSIX Regex 擴(kuò)展庫(kù) 和 PCRE 擴(kuò)展庫(kù),每一個(gè)函數(shù)庫(kù)對(duì)應(yīng)于一種特定的正則表達(dá)式。
需要注意的是,從 PHP5.3.0 開(kāi)始,POSIX Regex 擴(kuò)展將被廢棄,所有調(diào)用本擴(kuò)展中函數(shù)都將提示 E_DEPRECATED 錯(cuò)誤。
接下來(lái)本文會(huì)對(duì) PCRE 規(guī)范的正則表達(dá)式作出詳細(xì)介紹。
PCRE 正則語(yǔ)法 1. 分隔符當(dāng)使用 PCRE 函數(shù)的時(shí)候,模式需要由分隔符閉合包裹。分隔符可以使任意非字母數(shù)字、非反斜線、非空白字符。一般是使用斜線 / 作為定界符。
如果分隔符需要在模式內(nèi)進(jìn)行匹配,它必須使用反斜線進(jìn)行轉(zhuǎn)義。如果分隔符經(jīng)常在 模式內(nèi)出現(xiàn), 一個(gè)更好的選擇就是是用其他分隔符來(lái)提高可讀性。2. 原子
原子是正則表達(dá)式的最基本的組成單位,而且必須至少包含一個(gè)原子。常見(jiàn)的有:
. 匹配除換行符之外任意字符 d 匹配任意一個(gè)十進(jìn)制數(shù)字 D 匹配任意一個(gè)非十進(jìn)制字符 s 匹配一個(gè)不可見(jiàn)原子 S 匹配一個(gè)可見(jiàn)原子 w 匹配任意一個(gè)數(shù)字、字母或下劃線,同 `[a-zA-Z0-9_]` W 匹配任意非一個(gè)數(shù)字、字母或下劃線,同`[^a-zA-Z0-9_]` [] 作為一個(gè)原子,匹配 [] 之間的一個(gè)原子 [^] 作為一個(gè)原子,不能匹配 [] 之間的一個(gè)原子
PCRE 中有關(guān)原子和元字符的完整列表,請(qǐng)見(jiàn) 正則表達(dá)式。3. 元字符
元字符用來(lái)修飾原子的字符,不可以多帶帶出現(xiàn)。
//量詞 {n} 匹配原子恰好出現(xiàn)n次 {n,} 匹配原子出現(xiàn)不少于n次 {n,m} 匹配原子出現(xiàn)至少n次,最多m次 * 表示其前面的原子出現(xiàn)0至多次,相當(dāng)于{0,} + 表示前面的原子至少出現(xiàn)1次,相當(dāng)于{1,} ? 表示前面的原子出 0次或1次,相當(dāng)于{0,1} //邊界限制 ^ 指定匹配的字符串以什么原子開(kāi)頭 $ 指定匹配的字符串以什么原子結(jié)尾 //模式選擇符 | 多選一 //模式單元 () 多原子作為一個(gè)大原子4. 模式修正符
位于整個(gè)模式的最后面,在整個(gè)正則表達(dá)式中優(yōu)先調(diào)用,是對(duì)正則表達(dá)式功能的擴(kuò)展??梢砸淮问褂靡粋€(gè),每一個(gè)都具有一定的意義,也可以連續(xù)使用多個(gè)符號(hào)。
i //不區(qū)分大小寫(xiě) s //正則表達(dá)式中.匹配所有字符,包括換行符 U //匹配模式變?yōu)閼卸枘J?x //空白忽略PCRE 函數(shù)
函數(shù)名 | 說(shuō)明 |
---|---|
preg_filter | 執(zhí)行一個(gè)正則表達(dá)式搜索和替換 |
preg_grep | 返回匹配模式的數(shù)組條目 |
preg_last_error | 返回最后一個(gè)PCRE正則執(zhí)行產(chǎn)生的錯(cuò)誤代碼 |
preg_match_all | 執(zhí)行一個(gè)全局正則表達(dá)式匹配 |
preg_match | 執(zhí)行匹配正則表達(dá)式 |
preg_quote | 轉(zhuǎn)義正則表達(dá)式字符 |
preg_replace_callback_array | 執(zhí)行正則表達(dá)式搜索并使用回調(diào)進(jìn)行替換 |
preg_replace_callback | 執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換 |
preg_replace | 執(zhí)行一個(gè)正則表達(dá)式的搜索和替換 |
preg_split | 通過(guò)一個(gè)正則表達(dá)式分隔字符串 |
// 匹配 $qq = "[email protected]"; $pattern = "/^[1-9][0-9]{4,}$/"; if (preg_match($pattern, $email, $match)) { echo "匹配成功常用正則表達(dá)式
"; } else { echo "匹配失敗
"; } // 切割 $keywords = preg_split("/[s,]+/", "hypertext language, programming"); print_r($keywords); # Array ( [0] => hypertext [1] => language [2] => programming ) // 替換 $str = "foo o"; echo preg_replace("/ss+/", " ", $str); # "foo o" $count = 0; echo preg_replace(array("/d/", "/s/"), "*", "xp 4 to", -1 , $count); # xp***to echo $count; # 3
非空字符
$pattern = "/S+/";
手機(jī)號(hào)匹配
$pattern = "/^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])d{8}$/"; //匹配移動(dòng) $pattern = "^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])d{8}$"; //匹配聯(lián)通 $pattern = "^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])d{8}$"; //匹配電信 $pattern = "^1(3[3]|4[9]|53|7[037]|8[019])d{8}$";
E-mail 匹配
$pattern = "/^(w)+(.w+)*@(w)+(.w+)+$/";
URL 匹配
$pattern = "/^https?:////(w+.)+[a-z]+$/";
IP 地址匹配
$pattern = "/((?:(?:25[0-5]|2[0-4]d|[01]?d?d).){3}(?:25[0-5]|2[0-4]d|[01]?d?d))/";
身份證號(hào)匹配
$pattern = "/(^d{15}$)|(^d{18}$)|(^d{17}(d|X|x)$)/";
中國(guó)郵政編碼匹配
$pattern = "/^[1-9]d{5}(?!d)$/";
HTML 標(biāo)簽匹配
$pattern = "/^<([a-z]+)([^<]+)(?:>(.)1>|s+/>)$/";
中文匹配
$pattern = "/^[x{4e00}-x{9fa5}]+$/u";
注:PHP 中使用 x 表示十六進(jìn)制數(shù)據(jù)。
日期匹配
$pattern1 = "/^d{4}-d{1,2}-d{1,2}$/"; # 2018-04-27 $pattern2 = "/^(0?[1-9]|1[0-2])$/"; # 月份(01~09和1~12) $pattern3 = "/^((0?[1-9])|((1|2)[0-9])|30|31)$/"; # 日期(01~09和1~31)
以上內(nèi)容整理自網(wǎng)絡(luò),參考文章:
正則表達(dá)式
PCRE
PHP正則表達(dá)式
PHP高級(jí)特性一之正則表達(dá)式用法
常用正則表達(dá)式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28689.html
摘要:兼容的正則表達(dá)式已經(jīng)實(shí)現(xiàn)了很多使用不同解析引擎的正則函數(shù)。中主要有兩個(gè)正則解析器一個(gè)稱為,另一個(gè)稱為兼容正則表達(dá)式。在中,每個(gè)正則表達(dá)式模式都是使用符合格式的字符串。 原文鏈接: Getting Started with PHP Regular Expressions Last-Modified: 2019年5月10日16:23:19譯者注: 本文是面向0正則基礎(chǔ)的phper, 很多...
摘要:正則表達(dá)式的都是匹配和替換搜索正則表達(dá)式要匹配的字符串匹配到的字符串匹配到的個(gè)數(shù),沒(méi)有匹配到返回下面是例子執(zhí)行一個(gè)正則表達(dá)式匹配,非貪婪執(zhí)行一個(gè)全局正則表達(dá)式匹配,貪婪執(zhí)行結(jié)果匹配所有僅由有一個(gè)單詞組成的科目名輸出結(jié)果替換正則表達(dá)式要匹 正則表達(dá)式的都是匹配和替換 PHP 搜索 preg_match* /** * int preg_match* ( string $pattern ,...
摘要:正則表達(dá)式的都是匹配和替換搜索正則表達(dá)式要匹配的字符串匹配到的字符串匹配到的個(gè)數(shù),沒(méi)有匹配到返回下面是例子執(zhí)行一個(gè)正則表達(dá)式匹配,非貪婪執(zhí)行一個(gè)全局正則表達(dá)式匹配,貪婪執(zhí)行結(jié)果匹配所有僅由有一個(gè)單詞組成的科目名輸出結(jié)果替換正則表達(dá)式要匹 正則表達(dá)式的都是匹配和替換 PHP 搜索 preg_match* /** * int preg_match* ( string $pattern ,...
摘要:在閱讀這篇文章前最好把同系列文章實(shí)戰(zhàn)正則表達(dá)式一驗(yàn)證手機(jī)號(hào)先仔細(xì)閱讀一遍。但實(shí)際上這樣一個(gè)表達(dá)式是無(wú)法從上面的中提取第一個(gè)元素的這里主要的問(wèn)題是在默認(rèn)情況下點(diǎn)號(hào)字符無(wú)法匹配換行符。但是很遺憾,正則表達(dá)式中沒(méi)有排除型子表達(dá)式或者說(shuō)排除型分組。 這篇文章通過(guò)提取html元素介紹了正則表達(dá)式中模式修飾符、貪婪匹配與非貪婪匹配、Unicode模式、環(huán)視等知識(shí)點(diǎn)。在閱讀這篇文章前最好把同系列文章...
摘要:正則表達(dá)式是什么是一種字符串處理的工具搜索匹配搜索替換搜索分割功能強(qiáng)大是一種規(guī)則正則表達(dá)式應(yīng)用范圍數(shù)據(jù)驗(yàn)證數(shù)據(jù)處理過(guò)濾數(shù)據(jù)查詢各語(yǔ)言都支持正則表達(dá)式相關(guān)函數(shù)正則表達(dá)式一個(gè)匹配返回匹配結(jié)果的次數(shù)執(zhí)行一個(gè)全局正則表達(dá)式匹配返回匹配結(jié)果的次數(shù) 正則表達(dá)式是什么 是一種字符串處理的工具(搜索匹配、搜索替換、搜索分割) 功能強(qiáng)大,是一種規(guī)則 正則表達(dá)式應(yīng)用范圍 數(shù)據(jù)驗(yàn)證 數(shù)據(jù)處理/過(guò)濾 數(shù)...
閱讀 2071·2021-11-24 09:39
閱讀 1194·2021-09-10 11:25
閱讀 1837·2021-09-08 10:42
閱讀 3804·2021-09-06 15:00
閱讀 2535·2019-08-30 15:54
閱讀 3146·2019-08-29 17:08
閱讀 3312·2019-08-29 11:26
閱讀 2871·2019-08-28 18:27