版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
8.1正則表達(dá)式簡介、語法演講人1正則表達(dá)式簡介012PHP正則表達(dá)式語法02目錄011正則表達(dá)式簡介1正則表達(dá)式簡介在某些應(yīng)用中,有時(shí)候需要根據(jù)一定的規(guī)則來匹配(查找)確認(rèn)一些字符串,如要求用戶輸入的QQ號碼為數(shù)字且至少5位。用于描述這些規(guī)則的工具就是正則表達(dá)式。1.1最簡單的匹配最簡單的匹配就是直接給定字符匹配。如用字符a去匹配aabab,則會匹配出3個(gè)結(jié)果,分別是字符串中的第1,2和第4個(gè)字符。這種匹配是最簡單的情況,但往往實(shí)際處理中會復(fù)雜得多,如下面的“QQ號碼為數(shù)字且至少5位”,其對應(yīng)的正則表達(dá)式為:^\d{5,}$該正則表達(dá)式就描述需要確定的內(nèi)容為至少5位以上的數(shù)字。該表達(dá)式是怎么描述這一規(guī)則的:^:表示匹配字符串的開始,也即該字符串是獨(dú)立的開始而不是包含在某個(gè)字符串之內(nèi)\d:表示匹配數(shù)字{5,}:表示至少匹配5位及以上1.1最簡單的匹配$:表示匹配字符串的結(jié)束,也即該字符串是獨(dú)立的結(jié)束現(xiàn)在就很清楚了,該正則表達(dá)式綜合起來就是匹配5位以上的連續(xù)數(shù)字,且有獨(dú)立的開始和結(jié)束,對于少于5位的數(shù)字,或者不是以數(shù)字開始和結(jié)尾的如a123456b這樣都是無效的。從該實(shí)例可以看出,正則表達(dá)式是從左至右描述的。同樣,如果要匹配移動號碼的正則表達(dá)式為:^1\d{10}$提示由于對正則表達(dá)式的匹配結(jié)果,在很多情況下都不是那么確定,所以最好下載一些輔助工具用于測試正則表達(dá)式的匹配結(jié)果。這類工具如MatchTracer、RegExBuilder等,以及其他類似的工具也可。1.2元字符在上面的實(shí)例中,^、\d及$等這些符號,代表了特定的匹配意義,稱之為元字符,常用的元字符如下:提示當(dāng)要匹配這些元字符的時(shí)候,需要用到字符轉(zhuǎn)義功能,同樣正則表達(dá)式里面用\來表示轉(zhuǎn)義,如要匹配.符號,則需要用\.,否則.會被解釋成“除換行符外的任意字符”。當(dāng)然,要匹配\,則需要寫成\\連續(xù)的數(shù)字或字母可以用–符號連接起來,如匹配所有的小寫字母,[1-5]匹配1至5這5個(gè)數(shù)字022PHP正則表達(dá)式語法2.1重復(fù)規(guī)則正則表達(dá)式的威力在于其能夠在模式中包含選擇和循環(huán),正則表達(dá)式用一些重復(fù)規(guī)則來表達(dá)循環(huán)匹配。常用的重復(fù)如下:2.2分枝分枝是指制定幾個(gè)規(guī)則,如果滿足任意一種規(guī)則,則都當(dāng)作匹配成功。具體來說就是用|符號把各種規(guī)則分開,且條件從左至右匹配。提示由于分枝規(guī)定,只要匹配成功,就不再對后面的條件加以匹配,所以如果想匹配有包含關(guān)系的內(nèi)容,請注意規(guī)則的順序。下面是一個(gè)使用分枝的實(shí)例。美國的郵政編碼的規(guī)則是5個(gè)數(shù)字或者5個(gè)數(shù)字連上4個(gè)數(shù)字,如12345或者54321-1234,如果要匹配所有的郵編,則正確的正則表達(dá)式為:\d{5}-\d{4}|\d{5}//錯(cuò)誤寫法2.2分枝\d{5}|\d{5}-\d{4}下面的錯(cuò)誤寫法,只能匹配到5位數(shù)字及9位數(shù)字的前5位數(shù)字的情況,而不能匹配9位數(shù)字的郵編。2.3分組在正則表達(dá)式中,可以用小括號將一些規(guī)則括起來當(dāng)作分組,分組可以作為一個(gè)元字符來看待。分組的實(shí)例,驗(yàn)證IP地址:(\d{1,3}\.){3}\d{1,3}這是一個(gè)簡單的且不完善的匹配IP地址的正則表達(dá)式,因?yàn)樗四芷ヅ湔_的IP地址外,還能匹配如322.197.578.888這種不存在的IP地址。當(dāng)然,用這個(gè)表達(dá)式簡單匹配成功后可以在利用PHP的算術(shù)比較再加以判斷IP地址是否正確。而正則表達(dá)式中沒有提供算術(shù)比較功能,如果要完全匹配正確的IP地址,則需要改進(jìn)如下:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)2.3分組規(guī)則說明該規(guī)則關(guān)鍵之處在于確定IP地址每一段范圍為0-255,然后再重復(fù)4次即可。在:25[0-5]|2[0-4]\d|[01]?\d\d?中,用分枝首先確定了250-255和200-249。[01]?\d\d?則確定了0-199的范圍,綜合起來就是0-255。2.4貪婪與懶惰正則表達(dá)式默認(rèn)的情況下,會在滿足匹配條件下盡可能的匹配更多內(nèi)容。如a.*b,用他來匹配aabab,它會匹配整個(gè)aabab,而不會只匹配到aab為止,這就是貪婪匹配。與貪婪匹配對應(yīng)的是,在滿足匹配條件的情況下盡可能的匹配更少的內(nèi)容,這就是懶惰匹配。上述實(shí)例對應(yīng)的懶惰匹配規(guī)則為:a.*?b如果用該表達(dá)式去匹配aabab,那么就會得到aab和ab這樣兩個(gè)匹配結(jié)果。常用的懶惰限定符如下:2.5模式修正符模式修正符是標(biāo)記在整個(gè)正則表達(dá)式之外的,可以看著是對正則表達(dá)式的一些補(bǔ)充說明。常用的模式修正符如下:謝謝PHP正則表達(dá)式匹配函數(shù)陳學(xué)平8.3正則表達(dá)式匹配preg_match與preg_match_all函數(shù)013.1正則表達(dá)式在PHP中的應(yīng)用3.1正則表達(dá)式在PHP中的應(yīng)用在PHP應(yīng)用中,正則表達(dá)式主要用于:正則匹配:根據(jù)正則表達(dá)式匹配相應(yīng)的內(nèi)容正則替換:根據(jù)正則表達(dá)式匹配內(nèi)容并替換正則分割:根據(jù)正則表達(dá)式分割字符串在PHP中有兩類正則表達(dá)式函數(shù),一類是Perl兼容正則表達(dá)式函數(shù),一類是POSIX擴(kuò)展正則表達(dá)式函數(shù)。二者差別不大,而且推薦使用Perl兼容正則表達(dá)式函數(shù),因此下文都是以Perl兼容正則表達(dá)式函數(shù)為實(shí)例說明。023.2定界符3.2定界符Perl兼容模式的正則表達(dá)式函數(shù),其正則表達(dá)式需要寫在定界符中。任何不是字母、數(shù)字或反斜線()的字符都可以作為定界符,通常使用/作為定界符。具體使用見下面的實(shí)例。注意:盡管正則表達(dá)式功能非常強(qiáng)大,但如果用普通字符串處理函數(shù)能完成的,就盡量不要用正則表達(dá)式函數(shù),因?yàn)檎齽t表達(dá)式效率會低得多。3.3preg_match()函數(shù)preg_match()函數(shù)用于進(jìn)行正則表達(dá)式匹配,成功返回1,否則返回0。語法:intpreg_match(stringpattern,stringsubject[,arraymatches])實(shí)例1:preg_match()函數(shù)實(shí)例代碼如下:<?phpif(preg_match("/php/i","PHPisthewebscriptinglanguageofchoice.",$matches)){3.3preg_match()函數(shù)3.3preg_match()函數(shù)preg_match()第一次匹配成功后就會停止匹配,如果要實(shí)現(xiàn)全部結(jié)果的匹配,即搜索到subject結(jié)尾處,則需使用preg_match_all()函數(shù)。實(shí)例2從一個(gè)URL中取得主機(jī)域名實(shí)例代碼如下:<?php//從URL中取得主機(jī)名preg_match("/^(http:\/\/)?([^\/]+)/i","/index.html",$matches);3.3preg_match()函數(shù)$host=$matches[2];//從主機(jī)名中取得后面兩段preg_match("/[^\.\/]+\.[^\.\/]+$/",$host,$matches);echo"域名為:{$matches[0]}";?>瀏覽器輸出:域名為:3.4
preg_match_all()函數(shù)8.3.4preg_match_all()函數(shù)preg_match_all()函數(shù)用于進(jìn)行正則表達(dá)式全局匹配,成功返回整個(gè)模式匹配的次數(shù)(可能為零),如果出錯(cuò)返回FALSE。語法:intpreg_match_all(stringpattern,stringsubject,arraymatches[,intflags])下面的實(shí)例演示了將文本中所有<pre></pre>標(biāo)簽內(nèi)的關(guān)鍵字(php)顯示為紅色。實(shí)例3使用preg_match_all()函數(shù)設(shè)置文字實(shí)例代碼如下:<?php$str="<pre>學(xué)習(xí)php是一件快樂的事。</pre><pre>所有的phper需要共同努力!</pre>";$kw="php";preg_match_all('/<pre>([\s\S]*?)<\/pre>/',$str,$mat);for($i=0;$i<count($mat[0]);$i++){$mat[0][$i]=$mat[1][$i];3.4
preg_match_all()函數(shù)$mat[0][$i]=str_replace($kw,'<spanstyle="color:#ff0000">'.$kw.'</span>',$mat[0][$i]);$str=str_replace($mat[1][$i],$mat[0][$i],$str);}echo$str;?>輸出結(jié)果學(xué)習(xí)php是一件快樂的事。所有的phper需要共同努力!3.4
preg_match_all()函數(shù)033.5正則匹配中文漢字3.5正則匹配中文漢字正則匹配中文漢字根據(jù)頁面編碼不同而略有區(qū)別:GBK/GB2312編碼:[x80-xff]+或[xa1-xff]+UTF-8編碼:[x{4e00}-x{9fa5}]+/u實(shí)例4:正則匹配中文漢字實(shí)例代碼如下:<?php$str="學(xué)習(xí)php是一件快樂的事。";preg_match_all("/[x80-xff]+/",$str,$match);//UTF-8使用://preg_match_all("/[x{4e00}-x{9fa5}]+/u",$str,$match);print_r($match);?>3.5正則匹配中文漢字//preg_match_all("/[x{4e00}-x{9fa5}]+/u",$str,$match);print_r($match);?>輸出:Array([0]=>Array([0]=>php))謝謝8.4.1正則替換與分割函數(shù)陳學(xué)平1.4.1正則替換簡介2.4.2正則替換補(bǔ)充說明3.實(shí)例7使用逆向引用4.5.1preg_split()函數(shù)5.5.2split()函數(shù)目錄4.1正則替換簡介preg_replace()函數(shù)用于正則表達(dá)式的搜索和替換。語法:mixedpreg_replace(mixedpattern,mixedreplacement,mixedsubject[,intlimit])4.2正則替換補(bǔ)充說明preg_replace()函數(shù)用于正則表達(dá)式的搜索和替換。4.2正則替換補(bǔ)充說明上述參數(shù)除limit外都可以是一個(gè)數(shù)組。如果pattern和replacement都是數(shù)組,將以其鍵名在數(shù)組中出現(xiàn)的順序來進(jìn)行處理,這不一定和索引的數(shù)字順序相同。如果使用索引來標(biāo)識哪個(gè)pattern將被哪個(gè)replacement來替換,應(yīng)該在調(diào)用preg_replace()之前用ksort()函數(shù)對數(shù)組進(jìn)行排序。實(shí)例5:使用preg_replace()函數(shù)添加-分隔符號實(shí)例代碼如下:<?php$str="Thequickbrownfoxjumpedoverthelazydog.";$str=preg_replace('/\s/','-',$str);echo$str;?>輸出結(jié)果為:The-quick-brown-fox-jumped-over-the-lazy-dog.4.2正則替換補(bǔ)充說明實(shí)例6使用數(shù)組:實(shí)例代碼如下:<?php$str="Thequickbrownfoxjumpedoverthelazydog.";$patterns[0]="/quick/";$patterns[1]="/brown/";$patterns[2]="/fox/";$replacements[2]="bear";$replacements[1]="black";$replacements[0]="slow";printpreg_replace($patterns,$replacements,$str);/*輸出:Thebearblackslowjumpedoverthelazydog.*/ksort($replacements);printpreg_replace($patterns,$replacements,$str);/*輸出:Theslowblackbearjumpedoverthelazydog.*/?>實(shí)例7使用逆向引用實(shí)例代碼如下:<?php$str='<ahref="/">cqcet</a>其他字符<ahref="/">sohu</a>';$pattern="/<a\s([\s\S]*?)>([\s\S]*?)<\/a>/i";printpreg_replace($pattern,'\\2',$str);?>實(shí)例7使用逆向引用輸出結(jié)果為:該實(shí)例演示了將文本中所有的<a></a>標(biāo)簽去掉。cqcet其他字符sohu8.5PHP正則表達(dá)式分割preg_split與split函數(shù)5.1preg_split()函數(shù)preg_split()函數(shù)用于正則表達(dá)式分割字符串。語法:arraypreg_split(stringpattern,stringsubject[,intlimit[,intflags]])返回一個(gè)數(shù)組,包含subject中沿著與pattern匹配的邊界所分割的子串。實(shí)例8:使用preg_split()函數(shù)分割字符串為數(shù)組5.1preg_split()函數(shù)實(shí)例代碼如下:<?php$str="phpmysql,apacheajax";$keywords=preg_split("/[\s,]+/",$str);print_r($keywords);?>輸出結(jié)果為:Array([0]=>php[1]=>mysql[2]=>apache[3]=>ajax)5.1preg_split()函數(shù)實(shí)例9:使用preg_split()函數(shù)分割字符串實(shí)例代碼如下:<?php$str='string';$chars=preg_split('//',$str,-1,PREG_SPLIT_NO_EMPTY);print_r($chars);?>輸出結(jié)果為:([0]=>s[1]=>t[2]=>r[3]=>i[4]=>n[5]=>g)5.1preg_split()函數(shù)實(shí)例10:使用preg_split()函數(shù)分割字符串返回字符串和偏移量實(shí)例代碼如下:<?php$str="phpmysql,apacheajax";$keywords=preg_split("/[\s,]+/",$str,-1,PREG_SPLIT_OFFSET_CAPTURE);print_r($keywords);?>5.2split()函數(shù)split()函數(shù)同preg_split()類似,用正則表達(dá)式將字符串分割到數(shù)組中,返回一個(gè)數(shù)組,但推薦使用preg_split()。語法:arraysplit(stringpattern,stringstring[,intlimit])如果設(shè)定了limit,則返回的數(shù)組最多包含limit個(gè)單元,而其中最后一個(gè)單元包含了string中剩余的所有部分。如果出錯(cuò),則返回FALSE。5.2split()函數(shù)實(shí)例11:使用split()函數(shù)分割數(shù)組實(shí)例代碼如下:<?php$date="2019-05-0820:00:01";print_r(split('[-:]',$date));?>輸出結(jié)果:Array([0]=>2019[1]=>05[2]=>08[3]=>20[4]=>00[5]=>01)提示如果不需要正則表達(dá)式的功能,可以選擇使用更快(也更簡單)的替代函數(shù)如explode()或str_split()。5.2split()函數(shù)split()函數(shù)對大小寫敏感,如果在匹配字母字符時(shí)忽略大小寫的區(qū)別,請使用用法相同的spliti()函數(shù)謝謝8.6PHP常用正則表達(dá)式整理陳學(xué)平2024-10-186PHP常用正則表達(dá)式整理016.1表單驗(yàn)證匹配驗(yàn)證賬號,字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線:^[a-zA-Z][a-zA-Z0-9_]{4,15}$驗(yàn)證賬號,不能為空,不能有空格,只能是英文字母:^\S+[a-zA-Z]$驗(yàn)證賬號,不能有空格,不能非數(shù)字:^\d+$驗(yàn)證用戶密碼,以字母開頭,長度在6-18之間:^[a-zA-Z]\w{5,17}$驗(yàn)證是否含有^%&',;=?$\等字符:[^%&',;=?$\x22]+匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*匹配騰訊QQ號:[1-9][0-9]{4,}6.1表單驗(yàn)證匹配匹配日期,只能是2004-10-22格式:^\d{4}\-\d{1,2}-\d{1,2}$1匹配國內(nèi)電話號碼:^\d{3}-\d{8}|\d{4}-\d{7,8}$2評注:匹配形式0571-12345678配中國郵政編碼:^[1-9]\d{5}(?!\d)$4匹配身份證:\d{14}(\d{4}|(\d{3}[xX])|\d{1})5評注:中國的身份證為15位或18位6不能為空且二十字節(jié)以上:^[\s|\S]{20,}$76.2字符匹配匹配由26個(gè)英文字母組成的字符串:^[A-Za-z]+$匹配由26個(gè)小寫英文字母組成的字符串:^[a-z]+$匹配由數(shù)字和26個(gè)英文字母組成的字符串:^[A-Za-z0-9]+$匹配由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:^\w+$匹配空行:\n[\s|]*\r匹配任何內(nèi)容:[\s\S]*匹配中文字符:[\x80-\xff
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度制造業(yè)農(nóng)民工臨時(shí)工勞動保障服務(wù)合同
- 2024年購物中心裝修設(shè)計(jì)及施工合同3篇
- 二零二五年度風(fēng)力發(fā)電站配電柜安裝與運(yùn)維合同
- 2024年版的股權(quán)轉(zhuǎn)讓與安全責(zé)任合同3篇
- 2025年度智能家居產(chǎn)品代理加盟合同
- 2025年班組施工與裝配式建筑構(gòu)件制造合同范本3篇
- 2024年通信基站建設(shè)施工承包合同的履約管理
- 2024年版高端鋁合金建筑模板購銷協(xié)議版B版
- 2024年貨物集裝箱航空運(yùn)輸協(xié)議
- 2024年標(biāo)準(zhǔn)精裝修住宅租賃合同樣本
- 安徽省合肥市包河區(qū)2021-2022學(xué)年七年級上學(xué)期生物期末試題
- CDNL-MR08 高溫試驗(yàn)測量方法 不確定度評定報(bào)告 V1.0
- 拓?fù)鋵W(xué)(黑龍江聯(lián)盟)知到章節(jié)答案智慧樹2023年哈爾濱工程大學(xué)
- 質(zhì)量功能展開一種以市場為導(dǎo)向的質(zhì)量策略
- 《新編MPA英語閱讀教程教學(xué)參考書》正文(第一-第十五單元)第二稿
- 酒店各崗位崗位職責(zé)
- “青藍(lán)工程”師徒結(jié)對體育青年教師總結(jié)反思
- 《工程造價(jià)管理》期末考試復(fù)習(xí)題(含答案)
- 露天煤礦土石方剝離施工組織設(shè)計(jì)
- 維修站出門證管理規(guī)定
- 臨時(shí)聘用人員薪酬管理辦法
評論
0/150
提交評論