Forum

Yampiz Forum

Sharing let knowledge Spreaded, Reading let spirits growth, Creative let culture extended, Let us
  • 禁止廣告文
  • 知識傳播
  • 閱讀
  • 心靈成長
  • 創作
  • 文化傳承
Forum Dictionary / Programming / 網頁/網站程式 / PHP /

PHP 正規化表示法

New Subject
Random
Previous
Next
|
PHP 正規化表示法

經常會用到到 PHP 正規化表示法,可是也常常忘了重要的表示符號,因為不同的程式語言在正規化表示法上,多多少少都有些許差異,所以寫起來免得自己忘記了,內容是參考網路上的資料,再做一點整理:

什麼是正規表示法

正規表示法提供了一種高級但不直覺的字符串匹配和處理的方法,利用正規表示法可以在資料中快速的找出關鍵的資訊。PHP 繼承 Unix 的一貫傳統,完全支持正規表示法的處理。用過正規表示法的朋友都知道,正規表示法的功能非常強大,但學起來並不是那麼容易。比如:

^.+@.+..+$

這段難以理解的代碼足夠使一些程式設計師頭痛,或者讓他們放棄使用正規表示法。 基本模式匹配 切從最基本的開始。模式,是正規表示法最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成,也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文。例如:

^once

這個模式包含一個特殊的字符 ^,表示該模式只匹配那些以 once 開頭的字符串。例如該模式與字符串 "once upon a time" 匹配,與 "There once was a man from NewYork" 不匹配。正如如 ^ 符號表示開頭一樣,$ 符號用來匹配那些以給定模式結尾的字符串。

bucket$

這個模式與 "Who kept all of this cash in a bucket" 匹配,與 "buckets" 不匹配。字符 ^ 和 $ 同時使用時,表示精確匹配(字符串與模式一樣)。例如:

^bucket$

只匹配字符串 "bucket"。如果一個模式不包括 ^ 和 $,那麼它與任何包含該模式的字符串匹配。例如:模式 once 與字符串 There once was a man from NewYork Who kept all of his cash in a bucket. 是匹配的。

在該模式中的字母(o-n-c-e)是字面的字符,也就是說,他們表示該字母本身,數字也是一樣的。其他一些稍微複雜的字符,如標點符號和白字符(空格、Tab等),需要作字元跳脫,也就是在符前加上反斜線。Tab 的控制字元跳脫是:\t。所以如果我們要檢測一個字符串是否以 Tab 開頭,可以用這個模式:

^\t

類似的,用 n 表示「新行」,r 表示回車。其他的特殊符號,可以用在前面加上反斜線,如反斜線本身用表示,句號 . 用 . 表示,以此類推。

字符簇

在網站程式中,正規表示法通常用來驗證用戶的輸入。當用戶提交一個表單以後,要判斷輸入的電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基於字面的字符是不夠的。所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個表示所有元音字符的字符簇,就把所有的元音字符放在一個方括號裡:

[AaEeIiOoUu]

這個模式與任何母音字符匹配,但只能表示一個字符。用連字號可以表示一個字符的範圍,如:

  • [a-z]:匹配所有的小寫字母
  • [A-Z]:匹配所有的大寫字母
  • [a-zA-Z]:匹配所有的字母
  • [0-9]:匹配所有的數字
  • [0-9.-]:匹配所有的數字,句號和減號
  • [ frtn]:匹配所有的白字符

同樣的,這些也只表示一個字符,這是一個非常重要的。如果要匹配一個由一個小寫字母和一位數字組成的字符串,比如 "z2"、"t6" 或 "g7",但不是 "ab2"、"r2d3" 或 "b52" 的話,用這個模式:

^[a-z][0-9]$

儘管 [a-z] 代表26個字母的範圍,但在這裡它只能與第一個字符是小寫字母的字符串匹配。 前面曾經提到^表示字符串的開頭,但它還有另外一個含義。當在一組方括號裡使用 ^ 是,它表示「非」或「排除」的意思,常常用來剔除某個字符。還用前面的例子,我們要求第一個字符不能是數字:

^[^0-9][0-9]$

這個模式與 "&5"、"g7" 及 "-2" 是匹配的,但與 "12"、"66" 是不匹配的。下面是幾個排除特定字符的例子:

  • [^a-z] //除了小寫字母以外的所有字符
  • [^/^] //除了"/"和"^"字符之外的所有字符
  • [^"'] //除了雙引號(")和單引號(')之外的所有字符

特殊字符 "." (點,句號)在正規表示法中用來表示除了「新行」之外的所有字符。所以模式 "^.5$" 與任何兩個字符的、以數字 5 結尾和以其他非「新行」字符開頭的字符串匹配。模式 "." 可以匹配任何字符串,除了空串和只包括一個「新行」的字符串。 PHP 的正規表示法有一些內建的通用字符簇,列表如下:

  • [[:alpha:]]:任何字母。
  • [[:digit:]]:任何數字。
  • [[:alnum:]]:任何字母和數字。
  • [[:space:]]:任何白字符。
  • [[:upper:]]:任何大寫字母。
  • [[:lower:]]:任何小寫字母。
  • [[:punct:]]:任何標點符號。
  • [[:xdigit:]]:任何16進制的數字,相當於 [0-9a-fA-F]。

到現在為止,已經知道如何去匹配一個字母或數字,但更多的情況下,可能要匹配一個單詞或一組數字。一個單詞有若干個字母組成,一組數字有若干個單數組成。跟在字符或字符簇後面的花括號 ({}) 用來確定前面的內容的重複出現的次數,括號中的數字第一位為最小數量,第二位為最大數量。

  • ^[a-zA-Z_]$ :所有的字母和下劃線 。
  • ^[[:alpha:]]{3}$ :所有的 3 個字母的單詞。
  • ^a$ :字母 a。
  • ^a{4}$ :aaaa。
  • ^a{2,4}$ :aa,aaa 或 aaaa。
  • ^a{1,3}$ :a,aa 或 aaa。
  • ^a{2,}$ :包含多於兩個a的字符串。
  • ^a{2,} :如:aardvark 和 aaab,但 apple 不行。
  • a{2,} :如:baad 和 aaa,但 Nantucket 不行。
  • \t{2} :兩個 Tab字符。
  • .{2} :所有的兩個字符。

這些例子描述了花括號的三種不同的用法。一個數字,{n} 的意思是「前面的字符或字符簇只出現 n 次」;一個數字加逗號,{n,} 的意思是「前面的內容出現 n 或更多的次數」;兩個用逗號分隔的數字,{n,y} 表示「前面的內容至少出現 n 次,但不超過 y 次」。我們可以把模式擴展到更多的單詞或數字:

  • ^[a-zA-Z0-9_]{1,}$ :所有包含一個以上的字母、數字或下劃線的字符串。
  • ^[0-9]{1,}$ :所有的正數。
  • ^-{0,1}[0-9]{1,}$ :所有的整數。
  • ^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ :所有的小數。

最後一個例子不太好理解,是嗎?這麼看吧:與所有以一個可選的負號 (-{0,1}) 開頭 (^) 、跟著 0 個或更多的數字 ([0-9]{0,}) 、和一個可選的小數點 (.{0,1}) 再跟上 0 個或多個數字 ([0-9]{0,}) ,並且沒有其他任何東西 ($) 。下面你將知道能夠使用的更為簡單的方法。

^-?[0-9]{0,}.?[0-9]{0,}$

特殊字符 "?" 與 {0,1} 是相等的,它們都代表著:「0個或1個前面的內容」或「前面的內容是可選的」。所以剛才的例子可以簡化為:

特殊字符 "*" 與 {0,} 是相等的,它們都代表著「0個或多個前面的內容」。

特殊字符 "+" 與 {1,} 是相等的,表示「1 個或多個前面的內容」,所以上面的 4 個例子可以寫成:

  • ^[a-zA-Z0-9_]+$ :所有包含一個以上的字母、數字或下劃線的字符串。
  • ^[0-9]+$ :所有的正數。
  • ^-?[0-9]+$ :所有的整數。
  • ^-?[0-9]*.?[0-9]*$ :所有的小數。
  • This is a declared original article, to respect the copyright, please do not repost this article without the consent of the author.
  • Keywords : 字符, 數字, 字符串, 模式, 字母, 正規, 匹配所, 內容, bucket, 開頭, 特殊字符, 新行, 字符串匹配, 單詞, 匹配, 意思, 小寫字母, 字符簇, 可選, 句號
0 0
2010-05-08T03:07:00+0000


  • Now, you can post comments by Facebook Account when your Yampiz account was logout or unvariable. whatever, we suggest to post comment by Yampiz Account to get more bounds to join new events of Heyxu
Comment
 
Verify
  • Auto Platform
    For better browsing experience, it will auto detects your device to display webpage.
  • Bug Report
    Tell us about the idea, problem and errors you found.
  • Comodo Secure
    The sensitive data transmission adopts by SSL-2048 authenticated encryption.
  • Copyright
    © 2009 YamPiz Digital Inc. & Jaby Group. All rights reserved.
  • Revised Version
    V2.2.061
    03 Aug 2023 (GMT+8)