PHP中的正則式使用
在渭城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都全網(wǎng)營(yíng)銷(xiāo)推廣,外貿(mào)網(wǎng)站制作,渭城網(wǎng)站建設(shè)費(fèi)用合理。
PHP被大量的應(yīng)用于Web的后臺(tái)CGI開(kāi)發(fā),通常是在用戶數(shù)據(jù)數(shù)據(jù)之后得出某種結(jié)果,但是如果用戶輸入的數(shù)據(jù)不正確,就會(huì)出現(xiàn)問(wèn)題,比如說(shuō)某人的生日是”2月30日”!那應(yīng)該怎么樣來(lái)檢驗(yàn)暑假是否正確呢? 在PHP中加入了正則表達(dá)式的支持,讓我們可以十分方便的進(jìn)行數(shù)據(jù)匹配。
2 什么是正則表達(dá)式:
簡(jiǎn)單的說(shuō),正則表達(dá)式是一種可以用于模式匹配和替換的強(qiáng)大工具。在幾乎所有的基于UNIX/LINUX系統(tǒng)的軟件工具中找到正則表達(dá)式的痕跡,例如:Perl或PHP腳本語(yǔ)言。此外,JavaScript這種客戶端的腳本語(yǔ)言也提供了對(duì)正則表達(dá)式的支持,現(xiàn)在正則表達(dá)式已經(jīng)成為了一個(gè)通用的概念和工具,被各類(lèi)技術(shù)人員所廣泛使用。
在某個(gè)Linux網(wǎng)站上面有這樣的話:”如果你問(wèn)一下Linux愛(ài)好者最喜歡什么,他可能會(huì)回答正則表達(dá)式;如果你問(wèn)他最害怕什么,除了繁瑣的安裝配置外他肯定會(huì)說(shuō)正則表達(dá)式。”
正如上面說(shuō)的,正則表達(dá)式看起來(lái)非常復(fù)雜,讓人害怕,大多數(shù)的PHP初學(xué)者都會(huì)跳過(guò)這里,繼續(xù)下面的學(xué)習(xí),但是PHP中的正則表達(dá)式有著可以利用模式匹配找到符合條件的字符串、判斷字符串是否合乎條件或者用指定的字符串來(lái)替代符合條件的字符串等強(qiáng)大的功能,不學(xué)實(shí)在太可惜了……
3 正則表達(dá)式的基本語(yǔ)法:
一個(gè)正則表達(dá)式,分為三個(gè)部分:分隔符,表達(dá)式和修飾符。
分隔符可以是除了特殊字符以外的任何字符(比如”/ !”等等),常用的分隔符是”/”。表達(dá)式由一些特殊字符(特殊字符詳見(jiàn)下面)和非特殊的字符串組成,比如”[a-z0-9_-]+@[a-z0-9_-.]+”可以匹配一個(gè)簡(jiǎn)單的電子郵件字符串。修飾符是用來(lái)開(kāi)啟或者關(guān)閉某種功能/模式。下面就是一個(gè)完整的正則表達(dá)式的例子:
/hello.+?hello/is
上面的正則表達(dá)式”/”就是分隔符,兩個(gè)”/”之間的就是表達(dá)式,第二個(gè)”/”后面的字符串”is”就是修飾符。
在表達(dá)式中如果含有分隔符,那么就需要使用轉(zhuǎn)義符號(hào)”",比如”/hello.+?/hello/is”。轉(zhuǎn)義符號(hào)除了用于分隔符外還可以執(zhí)行特殊字符,全部由字母構(gòu)成的特殊字符都需要”"來(lái)轉(zhuǎn)義,比如”d”代表全體數(shù)字。
4 正則表達(dá)式的特殊字符:
正則表達(dá)式中的特殊字符分為元字符、定位字符等等。
元字符是正則表達(dá)式中一類(lèi)有特殊意義的字符,用來(lái)描述其前導(dǎo)字符(即元字符前面的字符)在被匹配的對(duì)象中出現(xiàn)的方式。元字符本身是一個(gè)個(gè)單一的字符,但是不同或者相同的元字符組合起來(lái)可以構(gòu)成大的元字符。
元字符:
大括號(hào):大括號(hào)用來(lái)精確指定匹配元字符出現(xiàn)的次數(shù),例如”/pre{1,5}/”表示匹配的對(duì)象可以是”pre”、”pree”、”preeeee”這樣在”pr”后面出現(xiàn)1個(gè)到5個(gè)”e”的字符串?;蛘摺?pre{,5}/”代表pre出現(xiàn)0此到5次之間。
加號(hào):”+”字符用來(lái)匹配元字符前的字符出現(xiàn)一次或者多次。例如”/ac+/”表示被匹配的對(duì)象可以是”act”、”account”、”acccc”等在”a”后面出現(xiàn)一個(gè)或者多個(gè)”c”的字符串?!?”相當(dāng)于”{1,}”。
星號(hào):”*”字符用來(lái)匹配元字符前的字符出現(xiàn)零次或者多次。例如”/ac*/”表示被匹配的對(duì)象可以是”app”、”acp”、”accp”等在”a”后面出現(xiàn)零個(gè)或者多個(gè)”c”的字符串?!?”相當(dāng)于”{0,}”。
問(wèn)號(hào):”?”字符用來(lái)匹配元字符前的字符出現(xiàn)零次或者1次。例如”/ac?/”表示匹配的對(duì)象可以是”a”、”acp”、”acwp”這樣在”a”后面出現(xiàn)零個(gè)或者1個(gè)”c”的字符串?!?”在正則表達(dá)式中還有一個(gè)非常重要的作用,即”貪婪模式”。
還有兩個(gè)很重要的特殊字符就是”[ ]“。他們可以匹配”[]“之中出現(xiàn)過(guò)的字符,比如”/[az]/”可以匹配單個(gè)字符”a”或者”z”;如果把上面的表達(dá)式改成這樣”/[a-z]/”,就可以匹配任何單個(gè)小寫(xiě)字母,比如”a”、”b”等等。
如果在”[]“中出現(xiàn)了”^”,代表本表達(dá)式不匹配”[]“內(nèi)出現(xiàn)的字符,比如”/[^a-z]/”不匹配任何小寫(xiě)字母!并且正則表達(dá)式給出了幾種”[]“的默認(rèn)值:
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和數(shù)字
[:digit:]:匹配任何數(shù)字
[:space:]:匹配空格符
[:upper:]:匹配任何大寫(xiě)字母
[:lower:]:匹配任何小寫(xiě)字母
[:punct:]:匹配任何標(biāo)點(diǎn)符號(hào)
[:xdigit:]:匹配任何16進(jìn)制數(shù)字
另外下面這些特殊字符在轉(zhuǎn)義符號(hào)”"轉(zhuǎn)義后代表的含義如下:
s:匹配單個(gè)的空格符
S:用于匹配除單個(gè)空格符之外的所有字符。
d:用于匹配從0到9的數(shù)字,相當(dāng)于”/[0-9]/”。
w:用于匹配字母,數(shù)字或下劃線字符,相當(dāng)于”/[a-zA-Z0-9_]/”。
W:用于匹配所有與w不匹配的字符,相當(dāng)于”/[^a-zA-Z0-9_]/”。
D:用于匹配任何非10進(jìn)制的數(shù)字字符。
.:用于匹配除換行符之外的所有字符,如果經(jīng)過(guò)修飾符”s”的修飾,”.”可以代表任意字符。
利用上面的特殊字符可以很方便的表達(dá)一些比較繁瑣的模式匹配。例如”/d0000/”利用上面的正則表達(dá)式可以匹配萬(wàn)以上,十萬(wàn)一下的整數(shù)字符串。
定位字符:
定位字符是正則表達(dá)式中又一類(lèi)非常重要的字符,它的主要作用是用于對(duì)字符在匹配對(duì)象中的位置進(jìn)行描述。
^:表示匹配的模式出現(xiàn)在匹配對(duì)象的開(kāi)頭(和在”[]“里面不同)
$:表示匹配的模式出現(xiàn)在匹配對(duì)象的末尾
空格:表示匹配的模式出現(xiàn)在開(kāi)始和結(jié)尾的兩個(gè)邊界之一
“/^he/”:可以匹配以”he”字符開(kāi)頭的字符串,比如hello、height等等;
“/he$/”:可以匹配以”he”字符結(jié)尾的字符串即she等;
“/ he/”:空格開(kāi)頭,和^的作用一樣,匹配以he開(kāi)頭的字符串;
“/he /”:空格結(jié)束,和$的作用一樣,匹配以he結(jié)尾的字符串;
“/^he$/”:表示只和字符串”he”匹配。
括號(hào):
正則表達(dá)式除了可以用戶匹配,還可以用括號(hào)”()”來(lái)記錄需要的信息,儲(chǔ)存起來(lái),給后面的表達(dá)式讀取。比如:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
就是記錄郵件地址的用戶名,和郵件地址的服務(wù)器地址(形式為username@server.com之類(lèi)的),在后面如果想要讀取記錄下來(lái)的字符串,只是需要用”轉(zhuǎn)義符+記錄的次序”來(lái)讀取。比如”1〃就相當(dāng)于第一個(gè)”[a-zA-Z0-9_-]+”,”2〃相當(dāng)于第二個(gè)([a-zA-Z0-9_-]+),”3〃就是第三個(gè)(.[a-zA-Z0-9_-])。但是在PHP中,”"是一個(gè)特殊的字符,需要轉(zhuǎn)義,所以”"到了PHP的表達(dá)式中就應(yīng)該寫(xiě)成”1〃。
其他特殊符號(hào):
“|”:或符號(hào)”|”和PHP里面的或一樣,不過(guò)是一個(gè)”|”,而不是PHP的兩個(gè)”||”!意思就是可以是某個(gè)字符或者另一個(gè)字符串,比如”/abcd|dcba/”可能匹配”abcd”或者”dcba”。
5 貪婪模式:
前面在元字符中提到過(guò)”?”還有一個(gè)重要的作用,即”貪婪模式”,什么是
preg_match_all
匹配之后的結(jié)果是一個(gè)數(shù)組,echo
不能打印數(shù)組,你可以從數(shù)組中找到你要的數(shù)據(jù)在哪個(gè)鍵值然后
echo
$contents[$n];
現(xiàn)獲取此div的html串,然后處理。
例如:
ul
liMa hrMef="hMtMtp://xxx1" tarMget="_blaMnk" claMss=""/Ma/li
liMa hrMef="hMtMtp://xxx2" targMet="_blaMnk" claMss=""/Ma/li
/ul
正則:hMtMtp.+?(?=".+/a.*/li)
輸出:
hMtMtp://xxx1
hMtMtp://xxx2
(把上面大寫(xiě)的M都去掉)
用PHP正則表達(dá)式匹配,就可以提取class里面的數(shù)據(jù),并將no去除,完整的PHP程序如下
?php
$str='div?class="lot-nums"span?class="no7"/spanspan?class="no8"/spanspan?class="no5"/spanspan?class="no9"/spanspan?class="no2"/spanspan?class="no4"/spanspan?class="no6"/spanspan?class="no0"/spanspan?class="no3"/span?span?class="no1"/span/div';?
$regex='/span?class="no(\d+)"/i';?
preg_match_all($regex,$str,$result);?
print_r($result[1]);?
?
運(yùn)行結(jié)果
可用如下的代碼來(lái)實(shí)現(xiàn):
?php
$str1="|1234|#2354#@2314@
|1314|#2154#@2214@
|1234|#2354#@2314@
|1314|#2154#@2214@";
if(preg_match_all("/\|(\d{4})\|\#(\d{4})\#\@(\d{4})\@/m",$str1,?$out,?PREG_PATTERN_ORDER))
for($i=0;$icount($out[0]);$i++)
{
echo?"{'".$out[1][$i]."','".$out[2][$i]."','".$out[2][$i]."'}br/";
}
?
效果如下所示:
{'1234','2354','2354'}
{'1314','2154','2154'}
{'1234','2354','2354'}
{'1314','2154','2154'}
中文可以用正則表達(dá)式進(jìn)行匹配,但是具體匹配方法與中文的編碼方式有關(guān):
如果是GBK(GB2312、GB1080),那么中文的編碼范圍是:
\x80-\xff
如果是UTF-8編碼,那么中文的編碼范圍是:
\u4e00-\u9fa5
那么匹配漢字的正則表達(dá)式可以是:
/[\x7f-\xff]+/
或者
/[\u4e00-\u9fa5]+/
例子代碼,顯示文件中的所有漢字(GBK編碼):
?php
$s=file_get_contents('1.txt');
if?(preg_match_all('/[\x7f-\xff]+/',?$s,?$r)){
for?($i=1;$icount($r[0]);$i++)?echo?"$i\t".$r[0][$i]."\n";
}
?
分享文章:php正則匹配提取數(shù)據(jù) php正則匹配html標(biāo)簽內(nèi)容
分享地址:http://jinyejixie.com/article26/dochojg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)