程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP學習筆記之POSIX正則表達式

PHP學習筆記之POSIX正則表達式

編輯:關於PHP編程

PHP學習筆記之POSIX正則表達式


PHP學習筆記之POSIX正則表達式

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_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$


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

符號“@”匹配字符“@”。

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

字符組合“\.”匹配“.”字符。我們在字符類外部使用點號,因此必須對其轉義,使其能夠匹配一個點號字符。

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

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

“每個星期讀一本書,那麼一年就讀了50本書” 加油。。。 別給自己太多放棄的理由。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved