PHP Regex之正則處理函數小結(preg_match,preg_match_all,preg_replace,preg_split)

來源:互聯網
上載者:User

前面我們已經學習了Regex的基礎文法,包括了定界符、原子、元字元和模式修正 符。實際上Regex想要起作用的話,就必須借用Regex處理函數。本節我們就來介紹一下PHP中基於perl的Regex處理函數,主要包含了分割, 匹配,尋找,替換等等處理操作,依舊是配合樣本講解,讓我們開始吧。

和Regex一樣,Regex處理函數不能夠獨立使用,而這必須相結合,才能夠完成特定的功能。在前面我們也說過,基於perl的Regex要快於POXISRegex處理函數,所以我們只介紹以preg開頭的基於perl的Regex。注意:在能偶使用字串函數處理的時候,就不要使用Regex來處理字串,因為字串處理函數更快。

下面我們來看一些常用的Regex處理函數。

1,preg_match()函數。

函數preg_match()執行一個Regex匹配,其定義如下:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

實際上就是搜尋subject中匹配pattern的部分, 以儲存在數組matches中.請看樣本: 複製代碼 代碼如下:<?php
$pattern = '/<b>.*?<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas';
if (preg_match($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

2,preg_match_all()函數。

函數preg_match_all()函數執行一個全域Regex匹配,其定義和preg_match()函數一致,只不過匹配了全部結果。請看樣本: 複製代碼 代碼如下:<?php
$pattern = '/<b>.*?<\/b>/';
$string = '<b>welcome</b> <b>to</b> <b>phpfuns</b>dsadsadas';
if (preg_match_all($pattern, $string, $arr)) {
echo "Regex<b>{$pattern}</b>和字串<b>{$string}</b>匹配成功<br>";
print_r($arr);
} else {
echo "<font color='red'>Regex{$pattern}和字串{$string}匹配失敗</font>";
}
?>

依舊是上面的樣本(只換了正則處理函數為preg_match_all()),但是匹配的結果數組內容不一樣了。

3, preg_replace()函數

函數preg_replace()執行一個Regex替換,其定義如下:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

實際上就是搜尋subject中匹配pattern的部分, 以replacement進行替換.其中limit指的是每個模式在每個subject上進行替換的最大次數. 預設是 -1(無限). 如果指定count,將會被填充為完成的替換次數.

注意:

A,如果subject是一個數組, preg_replace()返回一個數組, 其他情況下返回一個字串.

B,如果匹配被尋找到, 替換後的subject被返回, 其他情況下返回沒有改變的subject. 如果發生錯誤, 返回NULL .

C,子模式可以應用到參數replacement中,使用方式為\n或者${n}。(在Regex的模式中我們只能使用\n的形式來擷取已經匹配的子模式,切記!)

D,如果使用模式修正符e,則參數replacement中可以解析函數。(在其它的Regex處理函數中,模式修正符e均被忽略!)

請看下面的綜合樣本: 複製代碼 代碼如下:<?php
$pattern = '/(php)|(mysql)/e';
$string = '這個字串中的php和mysql被替換成大寫的了!';
$result = preg_replace($pattern, 'strtoupper("${1}\2")', $string, -1, $count);
echo $result.'<br>';
echo $count;
?>

上例中,我們使用了模式修正符e,這樣的話strtoupper()函數就可以當作字串被解析,這就是模式修正符e的作用!而參數${1}和\2分別是子模式1和子模式2。上例的作用就是將字串$string中匹配到的子模式php和mysql替換成大寫字母!

4,preg_split()函數。

preg_split執行一個Regex分隔字串。其定義如下:

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

實際上就是將subject按照pattern分割,返回分割後的數組。其中,limit將限制分隔得到的子串最多隻有limit個, 返回的最後一個子串將包含所有剩餘部分.limit值為-1, 0或null時都代表"不限制"。

我們來看一個樣本: 複製代碼 代碼如下:<?php
$pattern = '/<p>(.*?)<\/p>/';
$string = '這個字串中的<p>php</p>和<p>mysql</p>被分割了!';
$result = preg_split($pattern, $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($result);
?>

上例中,我們使用了常量PREG_SPLIT_DELIM_CAPTURE設 置返回結果中包含子模式(如果設定為PREG_SPLIT_NO_EMPTY,preg_split()將進返回分隔後的非空部分。)我們如果把上例中正 則運算式的括弧去掉,則結果中不再包含php和mysql這兩個匹配成功的子模式。

常用的Regex處理函數我們就介紹完了,本節的例子可能會難一些,但希望大家還是認真的實驗並體會一下,後面的Regex應用部分,我們會經常使用Regex處理函數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.