PHP POSIX正規表示式

2020-07-16 10:05:50
1 基礎知識

正規表示式是一種描述一段文字模式的方法。到目前為止,我們前面所用到過的精確(文字)匹配也是一種正規表示式。例如,前面我們曾搜尋過正規表示式的術語,像"shop"和"delivery"。

在PHP中,匹配正規表示式更有點像strstr()匹配,而不像相等比較,因為是在一個字串的某個位置(如果不指明則可能在字串中的任何位置)匹配另一個字串。例如,字串"shop"匹配正規表示式"shop"。它也可以匹配正規表示式"h"、"ho",等。

除了精確匹配字元外,還可以用特殊字元來指定表示式的元意(meta-meaning)。例如,使用特殊字 符,可以指定一個在字串開始或末尾肯定存在的模式,該模式的某部分可能被重複,或模式中的字元屬於特定的某一型別。此外,還可以按特殊字元的出現來匹 配。接下來,我們將逐個討論這些變化。

2 字元集和類

使用字元集可以馬上給出比精確匹配功能還要強大的正規表示式。字元集可以用於匹配屬於特定型別的任何字元;事實上它們是一種萬用字元。

首先,可以用字元作為一個萬用字元來代替除換行符(n)之外的任一個字元。例如,正規表示式:

.at

可以與"cat"、"sat"和"mat"等進行匹配。通常,這種萬用字元匹配用於作業系統中的檔名匹配。

但是,使用正規表示式,可以更具體地指明希望匹配的字元型別,而且可以指明字元所屬的一個集合。在前面的例子中,正規表示式匹配"cat"和"mat",但也可以匹配"#at"。如果要限定它是a到z之間的字元,就可以像下面這樣指明:

[a-z]at

任何包含在方括號([])中的內容都是一個字元類——一個被匹配字元所屬的字元集合。請注意,方括號中的表示式只匹配一個字元。

我們可以列出一個集合,例如:

[aeiou]

可以用來表示元音子母。

也可以描述一個範圍,正如前面用連字元那樣,也可以是一個範圍集:

[a-zA-Z]

這個範圍集代表任何的大小寫字母。

此外,還可以用集合來指明字元不屬於某個集。例如:

[^a-z]

可以用來匹配任何不在a和z之間的字元。當把脫字元號(^)包括在方括號裡面時,表示否。當該符號用在方括號的外面,則表示另外一個意思,我們稍後將詳細介紹。

3 重複

通常,讀者會希望指明某個字串或字元類將不止一次地出現。可以在正規表示式中使用兩個特殊字元代替。符號「*」表示這個模式可以被重複0次或更多次,符號「+」則表示這個模式可以被重複1次或更多次。這兩個符號應該放在要作用的表示式的後面。

例如:

[[:alnum:]]+

表示「至少有一個字母字元」。

4 子表示式

通常,將一個表示式分隔為幾個子表示式是非常有用的,例如,可以表示「至少這些字串中的一個需要精確匹配」。可以使用圓括號來實現,與在數學表示式中的方法一樣。

例如:

(very)*large

可以匹配"large"、"very large"、"very very large"等。

5 子表示式計數

可以用在花括號({})中的數位表示式來指定內容允許重複的次數。可以指定一個確切的重複次數({3}表示重複3次),或者一個重複次數的範圍({2,4}表示重複2~4次),或是一個開底域的重複範圍({2,}表示至少要重複兩次)。

例如:

(very){1,3}

表示匹配"very"、"very very"和"very very very"。

6 定位到字串的開始或末尾

[a-z]模式將匹配任何包含了小寫字母字元的字串。無論該字串只有一個字元,或者在整個更長的字串中只包含一個匹配的字元,都沒有關係。

也可以確定一個特定的子表示式是否出現在開始、末尾或在兩個位置都出現。當要確定字串中只有要找的單詞而沒有其他單詞出現時,它將相當有用。

脫字元號(^)用於正規表示式的開始,表示子字串必須出現在被搜尋字串的開始處,字元「$」用於正規表示式的末尾,表示子字串必須出現在字串的末尾。

例如,以下是在字串開始處匹配bob:

^bob

這個模式將匹配com出現在字串末尾處的字串:

com$

最後,這個模式將匹配只包含a到z之間一個字元的字串:

^[a-z]$

7 分支

可以使用正規表示式中的一條豎線來表示一個選擇。例如,如果要匹配com、edu或net,就可以使用如下所示的表示式:

com|edu|net

8 匹配特殊字元

如果要匹配本節前面提到過的特殊字元,例如,.、{或者$,就必須在它們前面加一個反斜槓()。如果要匹配一個反斜槓,則必須用兩個反斜槓()來表示。

在PHP中,必須將正規表示式模式包括在一個單引號字串中。使用雙引號參照的正規表示式將帶來一些不必要的複雜性。PHP還使用反斜槓來跳脫特殊字元——例如反斜槓。

如果希望在模式中匹配一個反斜槓,必須使用兩個反斜槓來表示它是一個反斜槓字元,而不是一個跳脫字元。

同樣,由於相同的原因,如果希望在一個雙引號參照的PHP字串中使用反斜槓字元,必須使用兩個反斜槓。這可 能會有些混淆,這樣要求的結果將是表示一個包含了反斜槓字元的正規表示式的一個PHP字串需要4個反斜槓。PHP直譯器將這4個反斜槓解釋成2個。然 後,由正規表示式直譯器解析為一個。

$符號也是雙引號參照的PHP字串和正規表示式的特殊字元。要使一個$字元能夠在模式中匹配,必須使用「$」。因為這個字串被參照在雙引號中,PHP直譯器將其解析為$,而正規表示式直譯器將其解析成一個$字元。

9 在智慧表單中應用

在智慧表單應用程式中,正規表示式至少有兩種用途。第一種用途是在顧客的反饋中查詢特定的名詞。使用正則表達 式,可以做得更智慧一些。使用一個字串函數,如果希望匹配"shop"、"customer service"或"retail",就必須做3次不同的搜尋。如果使用一個正規表示式,就可以同時匹配所有3個,如下所示:

shop|customer service|retail

第二個用途是驗證程式中使用者的電子郵件地址,這需要通過用正規表示式來對電子郵件地址的標準格式進行編碼。這 個格式中包含一些數位或標點符號,接著是符號「@」,然後是包括文字或數位和字元組成的字串,後面接著是一個「.」(點號),後面包括文字或數位以連字 符組成的字串,可能還有更多的點號,直到字串結束,它的編碼如下所示:

^[a-zA-Z0-9_-.][email protected][a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$

子表示式^[a-zA-Z0-9_-.]+表示「至少由一個字母、數位、下畫線、連字元、點號或者這些字元組合為開始的字串」。請注意,當在一個字元類的開始或末尾處使用點號時,點號將失去其特殊萬用字元的意義,只能成為一個點號字元。

符號「@」匹配字元「@」。

而子表示式[a-zA-Z0-9-]+與包含文字數位字元和連字元的主機名匹配。請注意,我們去除了連字元,因為它是方括號內的特殊字元。

字元組合「.」匹配「.」字元。我們在字元類外部使用點號,因此必須對其跳脫,使其能夠匹配一個點號字元。

子表示式[a-zA-Z0-9-.]+$匹配域名的剩下部分,它包含字母、數位和連字元,如果需要還可包含更多的點號直到字串的末尾。

不難發現,有時一個無效的電子郵件地址也會符合這個正規表示式。找到所有無效電子郵件幾乎是不可能的,但是經 過分析,情形將會有所改善。可以按許多不同的方式精化這個表示式。例如,可以列出所有有效的頂級域(TLD)。當對某些物件進行限制的時候,請千萬小心, 因為可能排斥1%的有效資料的校驗函數比允許出現10%的無效資料的校驗函數還要麻煩。

推薦:《PHP教學

以上就是PHP POSIX正規表示式的詳細內容,更多請關注TW511.COM其它相關文章!