PHP繼承*NIX的一貫傳統,完全支援正規表達式的處理,對於用過PERL的正規表達式的人大都會理解它的功能非常強大,可是對於初學者來說確實不是件容易的事。 例如,如果有一個使用者輸入的字串,如「Z123456789」,想驗證使用者輸入的第一個字元是否是英文字母,而且都要大寫,這該如可判斷? 這時候,可能解決的方法是先「取得第一個字元」,再利用「A ~ Z」ASCII值的範圍來判別這個字元,所以您可能會將程式寫為: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: | = 65 AND ord($b) <= 95 ) { echo "驗證合格!"; } else { echo "第一個字元不是大寫字母!"; } ?> | | 第03行:取得第一個字元; 第05行:研判第一個字元是不是在A(ASCII值是65)到Z(95)之間,若是,那第一個字母就是大寫字元。 | 此時,換一個比較複雜的狀況,也就是要驗證使用者輸入的E-mail地址是否合於標準格式,例如 abc@mail.tceb.edu.tw,那要如何檢查呢? 有人就發展出一套「字串樣式比對的技述性語言」,用來: - 檢查某字串是否完整對應到某樣式 (核對)
─ 例如某字串是否符合E-mail「帳號@網域名稱」的格式 - 在某字串中找尋對應樣式的子字串 (搜尋)
─ 例如在一篇文章中找出有關「大雄」二字的字串部份 - 由字串中取出對應到某樣式的字串 (取代)
─ 例如將文章中有關「大雄」二字的字串取代為「哆啦A夢」四字的字串。 簡單的來說,就是利用「正規表達式」來進行字串的比對及處理,但由於它的功能強大,相對也比較複雜,以下僅就較常用到的「語法規則」來解說: 一、行的開頭或結尾(Start and End of the Line) 符號 | 說明 | ^ | 會比對匹配文章裡的每一行開頭 | $ | 會比對匹配文章裡的每一行結尾 | 例如: 狀況一:如果寫成 「 ^This 」,則字串:「This is a book」符合這規則; 「Is this the book」就不符合這規則。 狀況二:如果寫成 「 book$」,則字串:「This is a book」、「Is this the book」都符合這規則。 狀況三:如果寫成 「 ^book$」,則只有字串僅能有 「 book 」這個單字,前後都不可以有其他文字出現。 狀況四:如果寫成 「 this」,則字串中任何位置只要有「this」這個單字,都符合規則;但大小寫有區別,例如「This is a book」不符合這規則,而「Is this the book」符合這規則。 二、字元集合(Character Classes) 符號 | 說明 | [集合] | 比對字元集合(範圍)的「一個」字元。 | 例如: 狀況一:如果寫成「 H[123456] 」,則表示字串可以是「 H1、H2、H3、H4、H5、H6 」都符合這個規則。 狀況二:如果寫成「 H[1-6] 」,則表示字串可以是「 H1、H2、H3、H4、H5、H6 」都符合這個規則,也就是可以將「 [123456] 」簡寫為「 [1- 6] 」。所以,有關英文字母、數字及一些標點符號可表示如下: [a-z] | 比對所有的小寫字母 | [A-Z] | 比對所有的大寫字母 | [a-zA-Z] | 比對所有的字母 | [0-9] | 比對所有的數字 | [0-9.-] | 比對所有的數字,句號和減號 | [ \f\r\t\n] | 比對所有的空白字元(注意 \t 前面是一個「空白」字元) | 所有之前的「Z123456789」的例子可以改寫如下: 01: 02: 03: 04: 05: 06: 07: 08: 09: | ereg ("^[A-Z]", $a ) ) { echo "驗證合格!"; } else { echo "第一個字元不是大寫字母!"; } ?> | | 第04行:利用ereg函數來比對第一個字元是不是大寫字元;^ 與 [A-Z] 都是可以組合的規則。 | 三、「非」或「排除」字元集合 這個部份前二項「 ^ 」與「 [ ] 」規則的組合,但「放的位置不同」,其表達的意義也不同,所以特別說明如下: 狀況一:如果寫成「 ^[A-Z] 」,則表示字串開頭的字元是英文大寫字母成即符合規則,例如「Z123456789」。 狀況二:如果寫成「 [^A-Z] 」(注意 ^ 的位置),則表示字串開頭的字元「不可以」是英文大寫字母,例如「Z123456789」就不行,但是如果是「 z123456789」(小寫) 或 「123456789Z」(開頭是數字)都符合這規則。 四、比對任意字元「.」 ( Dot,點) 直接用範例來說明: 狀況一:如果寫成「 A[.]B 」,則表示字串應是「 A.B 」才符合規則。(與前面介紹的規則相同) 狀況二:如果寫成「 A.B 」,則表示字串寫成「 A1B 」、「 AzB 」、「 A+B 」、.... 都符合規則,也就是第 2 個字元是任意的。 五、範圍比對,利用「 { } 」(大括號) 這個符號是用來比對「重複出現」的字元數,語法是「 {最小值, 最大值 } 」,利用範例如解說: 範例 | 說明 | ^a$ | 比對 a | ^a{2}$ | 比對 aa | ^a{2, 4}$ | 比對 aa 或 aaa 或 aaaa (只要是其中一種都符合規則) | ^a{2,}$ | 比對至少有 aa 開頭的字串就行,也就是 aaa、aaaa、aaxxx 都符合(注意! 「 ,} 」之間不可有空白」 | .{2} | 比對所有雙字元,例如aa、bb、11、&&都可 | 六、特殊字元「? 」、「*」、「+」 這三個符號其實是上面規則定義的延伸,說明如下: 符號 | 說明 | ? | 等於 {0,1},表示「前面的字元可以不出現(0)或出現一次(1)」 | * | 等於 {0,},表示「前面的字元可以不出現(0)或多次出現」 | + | 等於 {1,},表示「前面的字元必須出現一次(1)以上 」 | 七、其他:「|」符號及「 ( ) 」括號 符號 | 說明 | | | 相當於「OR」的意義;例如 「 A(B|b)C 」表示「ABC」或「AbC」都符合規則。 | ( ) | 指定字元序列,簡單來說,就是一個字串,例如 ^(book|notebook)表示開頭文字字串只要是 book 或 notebook 都符合規則。 | 所以,要比對 e-mail 格式的話,例如 abc@mail.tceb.edu.tw,那正規表達式的規則可以寫為: 也可以寫成「 ^(.+)@(.+)\.(.+)\.(.+)\.(.+)$ 」,這種「天書」剛開始學會很辛苦,可是一旦學會之後,您會發現往後在處理一些「驗證」字串功能時,就能理解其功能的強大。 |
沒有留言:
張貼留言