下面整理了php中正規的常用函數程式碼,方便大家學習php正規
preg_grep
(PHP 4, PHP 5)
preg_grep -- 傳回與模式相符的陣列單元說明
array preg_grep ( string pattern, array input [, int flags] )
preg_grep() 傳回一個數組,其中包含了input 數組中與給定的pattern 模式相符的單元。
flags 可以是以下標記:
PREG_GREP_INVERT
如果傳遞入此標記,preg_grep() 會傳回輸入陣列中不符合給定pattern 的單元。本標記自PHP 4.2.0 起可用。
自PHP 4.0.4 起,preg_grep() 傳回的結果使用從輸入陣列來的鍵名進行索引。如果不希望這樣的結果,用array_values() 對preg_grep() 傳回的結果重新索引。
上面是手冊上對preg_grep()的說明。首先這是perl相容的正規函數,所以我猜想preg_grep的意思是p(perl)reg(regular)_grep,其特點是可做用於數組,透過自己擴展,可用做多維數組中的正則匹配,並且可以透過flags參數傳回符合或非符合數組。其效率比用foreach(...){if...}結構快很多(未驗證),而且可匹配複雜模式。在搜尋、分檢等應用程式中用途不小。
例:
<?
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// 傳回所有含有浮點數的陣列元素。
$fl_array = preg_grep ("/^(d+)?.d+$/", $arr);
print_r($fl_array);
?>
preg_match
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match -- 進行正規表示式比對說明
int preg_match ( string pattern, string subject [, array matches [, int flags]] )
在subject 字串中搜尋與pattern 給予的正規表示式相符的內容。
如果提供了matches,則其會被搜尋的結果所填滿。 $matches[0] 將包含與整個模式相符的文本,$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文本,以此類推。
flags 可以是下列標記:
PREG_OFFSET_CAPTURE
如果設定本標記,則對每個出現的符合結果也同時傳回其附屬的字串偏移量。注意這改變了傳回的數組的值,使其中的每個單元也是一個數組,其中第一項為匹配字串,第二項為其偏移量。本標記自PHP 4.3.0 起可用。
flags 參數自PHP 4.3.0 起可用。
preg_match() 傳回pattern 所符合的次數。要么是0 次(沒有匹配)或1 次,因為preg_match() 在第一次匹配之後將停止搜尋。 preg_match_all() 則相反,會一直搜尋到subject 的結尾處。如果出錯preg_match() 回傳FALSE。
提示: 如果只想查看字串是否包含在另一個字串中,不要用preg_match()。可以用strpos() 或strstr() 來取代,要快得多。
上面是手冊裡對preg_match()的說明,我認為這個函數的功用在於他可做來做驗證,也就是某字串是否符合某特定要求。其限制是上面所說的要嘛匹配0次,要嘛1次。並且傳回值是匹配次數。當需要全匹配時可使用preg_match_all().另外值得一提的是$matches數組的作用,可做自模式的返回值,有時很有用。
例:
<?
if (preg_match ("/(bwebb)s(d)/i", "PHP is the web 45 scripting web 34 language of choice.",$match)) {
print "A match was found.";
print_r($match);
} else {
print "A match was not found.";
}
?>
<?php
// 從URL 取得主機名
preg_match("/^(http://)?([^/]+)/i",
" http://www.php.net/index.html ", $matches);
$host = $matches[2];
// 從主機名稱取得後面兩段
preg_match("/[^./]+.[^./]+$/", $host, $matches);
echo "domain name is: {$matches[0]}n";
?>
preg_match_all
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match_all -- 進行全域正規表示式比對手冊上該函數的解釋非常明確,就不多做說明了。
說明
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
在subject 中搜尋所有與pattern 給出的正則表達式匹配的內容並將結果以flags 指定的順序放到matches 中。
搜尋到第一個匹配項之後,接下來的搜尋從上一個匹配項末尾開始。
flags 可以是下列標記的組合(注意把PREG_PATTERN_ORDER 和PREG_SET_ORDER 合起來用沒有意義):
PREG_PATTERN_ORDER
將結果排序使$matches[0] 為全部模式匹配的數組,$matches[1] 為第一個括號中的子模式所匹配的字串組成的數組,以此類推。
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>this is a test</div >",
$out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."n";
print $out[1][0].", ".$out[1][1]."n";
?>
本例將輸出:
<b>example: </b>, <div align=left>this is a test</div>
example: , this is a test
因此,$out[0] 包含符合整個模式的字串,$out[1] 包含一對HTML 標記之間的字串。
PREG_SET_ORDER
將結果排序使$matches[0] 為第一組匹配項的數組,$matches[1] 為第二組匹配項的數組,以此類推。
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."n";
print $out[1][0].", ".$out[1][1]."n";
?>
本例將輸出:
<b>example: </b>, example:
<div align=left>this is a test</div>, this is a test
本例中,$matches[0] 是第一組匹配結果,$matches[0][0] 包含匹配整個模式的文本,$matches[0][1] 包含匹配第一個子模式的文本,以此類推。同樣,$matches[1] 是第二組配對結果,等等。
PREG_OFFSET_CAPTURE
如果設定本標記,則對每個出現的符合結果也同時傳回其附屬的字串偏移量。注意這改變了傳回的數組的值,使其中的每個單元也是一個數組,其中第一項為匹配字串,第二項為其在subject 中的偏移量。本標記自PHP 4.3.0 起可用。
如果沒有給予標記,則假定為PREG_PATTERN_ORDER。
傳回整個模式符合的次數(可能為零),如果出錯回傳FALSE。
範例1. 從某一文字取得所有的電話號碼
<?php
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d{4}/x",
"Call 555-1212 或 1-800-555-1212", $phones);
?>
範例2. 搜尋符合的HTML 標記(greedy)
<?php
// \2是一個逆向引用的例子,其在PCRE 中的意思是
// 必須符合正規表示式本身中第二組括號內的內容,本例中
// 就是([w]+)。因為字串在雙引號中,所以需要
// 多加一個反斜線。
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
preg_match_all ("/(<([w]+)[^>]*>)(.*)(</\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."n";
echo "part 1: ".$matches[1][$i]."n";
echo "part 2: ".$matches[3][$i]."n";
echo "part 3: ".$matches[4][$i]."nn";
}
?>
preg_quote
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_quote -- 轉義正規表示式字元說明
string preg_quote ( string str [, string delimiter] )
preg_quote() 以str 為參數並給其中每個屬於正規表示式語法的字元前面加上一個反斜線。如果你需要以動態產生的字串作為模式去匹配則可以用此函數轉義其中可能包含的特殊字元。
如果提供了可選參數delimiter,則該字元也會被轉義。可以用來轉義PCRE 函數所需的定界符,最常用的定界符是斜線/。
正規表示式的特殊字元包括:. + * ? [ ^ ] $ ( ) { } = ! < > | :。
註: 本函數可安全用於二進位物件。
上面是手冊上的解釋,也很明白,不多說了,另外手冊上還有一註釋就是該函數可安全用於二進位對象,這點很有用。
例: 例子1. preg_quote() 例子
<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // returns $40 for a g3/400
?>
例子2. 在某文本中的一個單字上加上斜體標記
<?php
// 本例中,preg_quote($word) 用來使星號不在正規表示式中
// 具有特殊意義。
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/".preg_quote($word)."/",
"<i>".$word."</i>",
$textbody);
?>
接下來就是應用超靈活、、功能超強大、使用超廣泛的preg_replace函數。
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace -- 執行正規表示式的搜尋與取代說明
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
在subject 中搜尋pattern 模式的匹配項並替換為replacement。如果指定了limit,則僅取代limit 個匹配,如果省略limit 或值為-1,則所有的匹配項都會被取代。
replacement 可以包含\n形式或(自PHP 4.0.4 起)$n 形式的逆向引用,首選使用後者。每個此種引用將被替換為與第n 個被捕獲的括號內的子模式所匹配的文本。 n 可以從0 到99,其中\0或$0 指的是整個模式所符合的文字。對左圓括號從左到右計數(從1 開始)以取得子模式的數目。
對替換模式在一個逆向引用後面緊接著一個數字時(即:緊接在一個匹配的模式後面的數字),不能使用熟悉的\1符號來表示逆向引用。舉例說\11 ,將會使preg_replace() 搞不清楚是想要一個\1的逆向引用後面跟著一個數字1 還是一個\11的逆向引用。本例中的解法是使用${1}1。這會形成一個隔離的$1 逆向引用,而使另一個1 只是單純的文字。
如果搜尋到符合項,則會傳回被取代後的subject,否則傳回原來不變的subject。
preg_replace() 的每個參數(除了limit)可以是一個陣列。如果pattern 和replacement 都是數組,將以其鍵名在數組中出現的順序來進行處理。這不一定和索引的數字順序相同。如果使用索引來識別哪個pattern 會被哪個replacement 來替換,應該在呼叫preg_replace() 之前用ksort() 對數組進行排序。
如果subject 是個數組,則會對subject 中的每個項目執行搜尋和替換,並傳回一個陣列。
如果pattern 和replacement 都是數組,則preg_replace() 會依序從中分別取出值來對subject 進行搜尋和替換。如果replacement 中的值比pattern 中的少,則以空字串作為餘下的替換值。如果pattern 是數組而replacement 是字串,則對pattern 中的每個值都用此字串作為替換值。反過來則沒有意義了。
/e 修正符使preg_replace() 將replacement 參數當作PHP 程式碼(在適當的逆向引用替換完之後)。提示:要確保replacement 構成一個合法的PHP 程式碼字串,否則PHP 會在報告在包含preg_replace() 的行中出現語法解析錯誤。
註: limit 參數是PHP 4.0.1pl2 之後加入的。
我認為其強大之處就是他不但可以處理字串,而且可以處理數組,而且他的逆向引用功能非常靈活。基本上他可以滿足一般使用者的大部分需求,如果他不能勝任,那麼我們還有preg_replace_callback()函數,可以自訂回呼函數,滿足你的高階要求。如設計過濾器等。
preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback -- 用回呼函數執行正規表示式的搜尋和取代說明
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
本函數的行為幾乎和preg_replace() 一樣,除了不是提供一個replacement 參數,而是指定一個callback 函數。該函數將以目標字串中的匹配數組作為輸入參數,並傳回用於替換的字串。
例子1. preg_replace_callback() 例子
<?php
// 此文字是用於2002 年的,
// 現在想使其能用於2003 年
$text = "April fools day is 04/01/2002n";
$text.= "Last christmas was 12/24/2001n";
// 回呼函數
function next_year($matches) {
// 通常:$matches[0] 是完整的匹配項
// $matches[1] 是第一個括號中的子模式的匹配項
// 以此類推
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|",
"next_year",
$text);
// 結果為:
// April fools day is 04/01/2003
// Last christmas was 12/24/2002
?>
You'll often need the callback function for a preg_replace_callback() in just one place. In this case you can use create_function() to declare an anonymous function as callback within the call to preg_replace_call back( have all information for the call in one place and do not clutter the function namespace with a callback functions name not used anywhere else.
對於使用preg_replace_callback()函數的朋友來說,你應該回需要callback函數(否則用他幹嘛,直接用preg_replace不是更好),不過也經常只是用一處。既然這樣你可以用create_function()來宣告一個匿名函式作為preg_replace_callback()的回呼函數。這樣,我們即滿足了宣告訊息的需要,有不致因這個不會再用到的函數名稱而混亂。
範例2. preg_replace_callback() 和create_function()
<?php
/* 一個UNIX 風格的命令列過濾器,將每個段落開頭的
* 大寫字母轉換成小寫字母*/
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>s*w|',
create_function(
// 這裡使用單引號很關鍵,
// 否則就把所有的$ 換成$
'$matches',
'return strtolower($matches[0]);'
),
$line
);
echo $line;
}
fclose($fp);
?>
最後是
preg_split
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_split -- 用正規表示式分割字串不再贅述。
說明
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
傳回一個數組,包含subject 中沿著與pattern 匹配的邊界所分割的子字串。
如果指定了limit,則最多傳回limit 個子字串,如果limit 是-1,則表示沒有限制,可以用來繼續指定可選參數flags。
flags 可以是下列標記的任意組合(用位元或運算子| 組合):
PREG_SPLIT_NO_EMPTY
如果設定了本標記,則preg_split() 只傳回非空的成分。
PREG_SPLIT_DELIM_CAPTURE
如果設定了本標記,定界符模式中的括號表達式也會被捕獲並傳回。本標記添加於PHP 4.0.5。
PREG_SPLIT_OFFSET_CAPTURE
如果設定了本標記,如果設定本標記,則對每個出現的符合結果也同時傳回其附屬的字串偏移量。注意這改變了傳回的數組的值,使其中的每個單元也是一個數組,其中第一項為匹配字串,第二項為其在subject 中的偏移量。本標記自PHP 4.3.0 起可用。
提示: 如果不需要正規表示式的功能,可以選擇使用更快(也更簡單)的替代函數如explode() 或str_split()。