PHP 正則表達(dá)式之正則處理函數(shù)小結(jié)(preg_match,preg_match_all,preg_replace,preg_split)
和正則表達(dá)式一樣,正則表達(dá)式處理函數(shù)不能夠獨(dú)立使用,而這必須相結(jié)合,才能夠完成特定的功能。在前面我們也說(shuō)過(guò),基于perl的正則表達(dá)式要快于POXIS正則表達(dá)式處理函數(shù),所以我們只介紹以preg開頭的基于perl的正則表達(dá)式。注意:在能偶使用字符串函數(shù)處理的時(shí)候,就不要使用正則表達(dá)式來(lái)處理字符串,因?yàn)樽址幚砗瘮?shù)更快。
下面我們來(lái)看一些常用的正則表達(dá)式處理函數(shù)。
1,preg_match()函數(shù)。
函數(shù)preg_match()執(zhí)行一個(gè)正則表達(dá)式匹配,其定義如下:
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
實(shí)際上就是搜索subject中匹配pattern的部分, 以保存在數(shù)組matches中.請(qǐng)看示例:
<?php
$pattern = '/<b>.*?<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas';
if (preg_match($pattern, $string, $arr)) {
echo "正則表達(dá)式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>正則表達(dá)式{$pattern}和字符串{$string}匹配失敗</font>";
}
?>
2,preg_match_all()函數(shù)。
函數(shù)preg_match_all()函數(shù)執(zhí)行一個(gè)全局正則表達(dá)式匹配,其定義和preg_match()函數(shù)一致,只不過(guò)匹配了全部結(jié)果。請(qǐng)看示例:
<?php
$pattern = '/<b>.*?<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas';
if (preg_match_all($pattern, $string, $arr)) {
echo "正則表達(dá)式<b>{$pattern}</b>和字符串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>正則表達(dá)式{$pattern}和字符串{$string}匹配失敗</font>";
}
?>
依舊是上面的示例(只換了正則處理函數(shù)為preg_match_all()),但是匹配的結(jié)果數(shù)組內(nèi)容不一樣了。
3, preg_replace()函數(shù)
函數(shù)preg_replace()執(zhí)行一個(gè)正則表達(dá)式替換,其定義如下:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
實(shí)際上就是搜索subject中匹配pattern的部分, 以replacement進(jìn)行替換.其中l(wèi)imit指的是每個(gè)模式在每個(gè)subject上進(jìn)行替換的最大次數(shù). 默認(rèn)是 -1(無(wú)限). 如果指定count,將會(huì)被填充為完成的替換次數(shù).
注意:
A,如果subject是一個(gè)數(shù)組, preg_replace()返回一個(gè)數(shù)組, 其他情況下返回一個(gè)字符串.
B,如果匹配被查找到, 替換后的subject被返回, 其他情況下返回沒(méi)有改變的subject. 如果發(fā)生錯(cuò)誤, 返回NULL .
C,子模式可以應(yīng)用到參數(shù)replacement中,使用方式為\n或者${n}。(在正則表達(dá)式的模式中我們只能使用\n的形式來(lái)獲取已經(jīng)匹配的子模式,切記?。?
D,如果使用模式修正符e,則參數(shù)replacement中可以解析函數(shù)。(在其它的正則表達(dá)式處理函數(shù)中,模式修正符e均被忽略!)
請(qǐng)看下面的綜合示例:
<?php
$pattern = '/(php)|(mysql)/e';
$string = '這個(gè)字符串中的php和mysql被替換成大寫的了!';
$result = preg_replace($pattern, 'strtoupper("${1}\2")', $string, -1, $count);
echo $result.'<br>';
echo $count;
?>
上例中,我們使用了模式修正符e,這樣的話strtoupper()函數(shù)就可以當(dāng)作字符串被解析,這就是模式修正符e的作用!而參數(shù)${1}和\2分別是子模式1和子模式2。上例的作用就是將字符串$string中匹配到的子模式php和mysql替換成大寫字母!
4,preg_split()函數(shù)。
preg_split執(zhí)行一個(gè)正則表達(dá)式分隔字符串。其定義如下:
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
實(shí)際上就是將subject按照pattern分割,返回分割后的數(shù)組。其中,limit將限制分隔得到的子串最多只有l(wèi)imit個(gè), 返回的最后一個(gè)子串將包含所有剩余部分.limit值為-1, 0或null時(shí)都代表"不限制"。
我們來(lái)看一個(gè)示例:
<?php
$pattern = '/<p>(.*?)<\/p>/';
$string = '這個(gè)字符串中的<p>php</p>和<p>mysql</p>被分割了!';
$result = preg_split($pattern, $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($result);
?>
上例中,我們使用了常量PREG_SPLIT_DELIM_CAPTURE設(shè) 置返回結(jié)果中包含子模式(如果設(shè)置為PREG_SPLIT_NO_EMPTY,preg_split()將進(jìn)返回分隔后的非空部分。)我們?nèi)绻焉侠姓?則表達(dá)式的括號(hào)去掉,則結(jié)果中不再包含php和mysql這兩個(gè)匹配成功的子模式。
常用的正則表達(dá)式處理函數(shù)我們就介紹完了,本節(jié)的例子可能會(huì)難一些,但希望大家還是認(rèn)真的試驗(yàn)并體會(huì)一下,后面的正則表達(dá)式應(yīng)用部分,我們會(huì)經(jīng)常使用正則表達(dá)式處理函數(shù)。
- PHP 字符串正則替換函數(shù)preg_replace使用說(shuō)明
- PHP正則替換函數(shù)preg_replace和preg_replace_callback使用總結(jié)
- php正則之函數(shù) preg_replace()參數(shù)說(shuō)明
- php正則preg_replace_callback函數(shù)用法實(shí)例
- PHP正則替換函數(shù)preg_replace()報(bào)錯(cuò):Notice Use of undefined constant的解決方法分析
- PHP 正則表達(dá)式常用函數(shù)使用小結(jié)
- PHP正則表達(dá)式基本函數(shù) 修飾符 元字符和需轉(zhuǎn)義字符說(shuō)明
- PHP 正則表達(dá)式函數(shù)庫(kù)(兩套)
- PHP 正則表達(dá)式常用函數(shù)
- PHP中的正則表達(dá)式函數(shù)介紹
- php 正則匹配函數(shù)體
- PHP正則表達(dá)式函數(shù)preg_replace用法實(shí)例分析
相關(guān)文章
PHP連接MySQL數(shù)據(jù)的操作要點(diǎn)
這篇文章主要介紹了PHP連接MySQL數(shù)據(jù)的操作要點(diǎn),本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-03-03phpadmin如何導(dǎo)入導(dǎo)出大數(shù)據(jù)文件及php.ini參數(shù)修改
新版本的phpadmin導(dǎo)入限定是8M,老版本的可能2M;如果遇到幾十兆的該怎么辦呢?接下來(lái)本文將介紹詳細(xì)的修改方法,感興趣的你可不要錯(cuò)過(guò)了哈,或許本文提供的知識(shí)點(diǎn)對(duì)你有所幫助2013-02-02改寫函數(shù)實(shí)現(xiàn)PHP二維/三維數(shù)組轉(zhuǎn)字符串
將多維數(shù)組中所有的數(shù)值轉(zhuǎn)換成字符串最多支持三維數(shù)組,在給定的示例函數(shù)基礎(chǔ)上改寫出了的,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-09-09php實(shí)現(xiàn)的簡(jiǎn)單中文驗(yàn)證碼功能示例
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單中文驗(yàn)證碼功能,結(jié)合實(shí)例形式分析了php中文驗(yàn)證碼功能的實(shí)現(xiàn)步驟與操作方法,包括圖形創(chuàng)建、編碼操作、session操作等相關(guān)技巧,需要的朋友可以參考下2017-01-01為Plesk PHP7啟用Oracle OCI8擴(kuò)展方法總結(jié)
在本篇文章里小編給大家總結(jié)了關(guān)于為Plesk PHP7啟用Oracle OCI8擴(kuò)展方法和相關(guān)代碼,需要的朋友們學(xué)習(xí)下。2019-03-03php通過(guò)排列組合實(shí)現(xiàn)1到9數(shù)字相加都等于20的方法
這篇文章主要介紹了php通過(guò)排列組合實(shí)現(xiàn)1到9數(shù)字相加都等于20的方法,實(shí)例分析了php排列組合數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08PHP中使用mktime獲取時(shí)間戳的一個(gè)黑色幽默分析
mktime(hour,minute,second,month,day,year,is_dst)這是mktime的語(yǔ)法說(shuō)明,一目了然應(yīng)該不難寫出一個(gè)時(shí)間戳的代碼來(lái)2012-05-05在PHP程序中運(yùn)行Python腳本(接收數(shù)據(jù)及傳參)的方法詳解
這篇文章主要為大家詳細(xì)介紹一下,如何在php程序中運(yùn)行Python腳本以及如何使用python返回josn數(shù)據(jù)供php使用,感興趣的小伙伴可以了解一下2022-09-09PHP+JS實(shí)現(xiàn)的實(shí)時(shí)搜索提示功能
這篇文章主要介紹了PHP+JS實(shí)現(xiàn)的實(shí)時(shí)搜索提示功能,涉及php結(jié)合ajax實(shí)時(shí)傳輸數(shù)據(jù)與字符串的遍歷、匹配相關(guān)操作技巧,需要的朋友可以參考下2018-03-03