PHP正則表達式學習筆記(二)

再說說常用的正則函數:

1.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...}結構快很多(未驗證),而且可匹配複雜模式。在搜索、分檢等應用中用途不小。

例:

2.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數組的作用,可做自模 式的返回值,有時很有用。

例子:

 

 

 

3.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] 爲第一個括號中的子模式所匹配的字符串組成的數組,以此類推。

<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] 爲第二組匹配項的數組,以此類推。

 


本例將輸出:
<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
子:從某文本中取得所有的電話號碼

 

 

4.preg_quote -- 轉義正則表達式字符
說明
string preg_quote ( string str [, string delimiter] )

preg_quote() str 爲參數並給其中每個屬於正則表達式語法的字符前面加上一個反斜線。如果你需要以動態生成的字符串作爲模式去匹配則可以用此函數轉義其中可能包含的特殊字 符。
如果提供了可選參數 delimiter,該字符也將被轉義。可以用來轉義 PCRE 函數所需要的定界符,最常用的定界符是斜線 /
則表達式的特殊字符包括:. / + * ? [ ^ ] $ ( ) { } = ! < > | :
: 本函數可安全用於二進制對象。
上面是手冊上的解釋,也很明白,不多說了,另外手冊上還有一註釋就是該函數可安全用於二進制對象,這點很有用。
例子:

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()

 

 


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()函數,可以自定義回調函數,滿足你的高級要求。如設計過濾器等。

6.preg_replace_callback -- 用回調函數執行正則表達式的搜索和替換
明:
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )

本函數的行爲幾乎和 preg_replace() 一樣,除了不是提供一個 replacement 參數,而是指定一個 callback 函數。該函數將以目標字符串中的匹配數組作爲輸入參數,並返回用於替換的字符串。
例子

 

結果爲:
April fools day is 04/01/2003
Last christmas was 12/24/2002
對於使用 preg_replace_callback()函數的朋友來說,你應該回需要callback函數(否則用他幹嘛,直接用preg_replace不是 更好),不過也經常只是用一處。既然這樣你可以用create_function()來聲明一個匿名函數作爲 preg_replace_callback()的回調函數。這樣,我們即滿足了聲明信息的需要,有不致因這個不會再用到的函數名而混亂。
例子 preg_replace_callback() create_function()

 

7.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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章