下面整理了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 ("/(\bweb\b)\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 or 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]."\n\n"; } ?> 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/2002\n"; $text.= "Last christmas was 12/24/2001\n"; // 回調函數 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_callback(). By doing it this way you 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()。