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