七月 18 2006

PHP的正規表達式

by at 10:34:03分類: PHP 標籤:

User View:2,050 user views Bot View:425 bot views

分享到Facebook

正規表達式是一種字串的格式比對 法,網頁上常常會出現使用者需要填寫表單的情況,可是要是你所需要的資料是如E-mail、電話、生日之類的,會有特定的格式,可是又怕使用者亂填一些無 效的資料,在這時候就要用到正規表達式了!正規表達式有分為POSIX、PCRE等等的規格,PHP預設式使用POSIX
正規表達式的表達方式大致分為 [允許字符]{數量}…來進行表達,如我希望檢查輸入字串是由六個以內的英文字母組成
[a-zA-Z]{0,6}

邊界

正規表達式以[ ] 為其邊界,表示在邊界之中的字符都會被許可,如果想要由英文母音組成的單字則可以打成 [aeiou],如果是一定範圍的文字可以使用”-”來作連結,例如我想要用小寫英文字母組成的單字,就可以用[a-z]

另一種則由( )所組合成,表示多個字元組,例如有文字是a.b.c.d. 這樣要使用正規表達可以打
([a-z]\.)+

字符

有些無法顯示的按鍵如Enter換行、Tab、Backspace這些,要表達這些字符就要用另一種表達方式
Enter => \n
Backspace => \r
Tab => \t

如要表達一些標點符號如 . \ * + 則要使用 \ 來作跳脫,也就是用 \. \\ \* \+來表達

除了可以單獨輸入允許的字符之外,還可以使用特別的命名格式

  • [:alnum:] 表示所有ASCII字母和數字,也等於[a-zA-Z0-9]
  • [:alpha:] 表示所有ASCII字母,等於[a-zA-Z]
  • [:blank:] 表示空格,等於[\t]
  • [:space:] 表示所有鍵盤操作,如空白、Tab、Enter、Backspace,相當於[\n\t\r\x0b]
  • [:digit:] 表示所有ASCII數字,也就是[0-9]
  • [:lower:] 表示所有小寫字母,也就是[a-z]
  • [:upper:] 表示所有大寫字母,也就是[A-Z]

點(.)的意義

正規表達式中,可以使用(.)點號來表達所有字符,如我想要同時選出son跟sun,我就可以用 s.n 來表達

重複

正規表達式不需要一個個文字來定義,如果是一連串的字符都一樣的格式就可以使用重複的方式,重複的方式主要用{起始,結束}來表達,如{1,6}就 是指重複1~6個字符,結束或起始其一字數也可以不用打,就表示超過多少或低於多少字數都可以,如{0,}表示0個或更多,{,6}則是表示六個以下的字 數,也可以直接輸入數字,表示固定的數量,如{3}表示三個字母
如我要表達IP位置(XXX.XXX.XXX.XXX),由四組數字組成,正規表達式表達方式就是
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

有些特殊情況可以使用內建的預定符號來表達

  • * = {0,}
  • + = {1,}
  • ? = {0,1}

範例

1. 電話格式
如希望使用者輸入格式是輸入台灣手機號碼 09XX-XXX-XXX則可以使用
09[0-9]{2}-[0-9]{3}-[0-9]{3}

2. E-mail格式
E-mail的格式基本是由 帳號@網域名,一般帳號可允許的字符有英文、數字與底線(Gmail還支援一種使用+號來分類的位置),而網域名則通常以英文、數字、點號與減號組成,中間用@作區隔
[a-zA-Z0-9\._\+]+@([a-zA-Z0-9\.-]\.)*[a-zA-Z0-9\.-]+

搭配PHP函式

ereg(正規表達式, 字串 [, 結果矩陣]);
如果沒有輸入第三個屬性變數的話,比對正確會回報true,比對錯物會回報fase
如果有輸入第三個屬性則會將比對正確的結果以矩陣的方式放進這個變數中!

eregi(正規表達式, 字串 [, 結果矩陣]);
與ereg功能一樣,只是不會區分大小寫!

例如:
檢查E-mail
ereg(”[a-zA-Z0-9\._\+]+@([a-zA-Z0-9\.-]\.)*[a-zA-Z0-9\.-]+”, “example@domain.name”);
這樣會回報true!

參數

后面的參數有以下幾個.分別代表:

i (PCRE_CASELESS)
如果設定此修正符,模式中的字符將同時匹配大小寫字母。

m(PCRE_MULTILINE)
默認情況下,PCRE 將目標字元串作為單一的一“行”字符所組成的(甚至其中包含有換行符也是如此)。“行起始”元字符(^)僅僅匹配字元串的起始,“行結束”元字符($)僅 僅匹配字元串的結束,或者最後一個字符是換行符時其前面(除非設定了 D 修正符)。這和 Perl 是一樣的。

當設定了此修正符,“行起始”和“行結束”除了匹配整個字元串開頭和結束外,還分別匹配其中的換行符的之后和之前。這和 Perl 的 /m 修正符是等效的。如果目標字元串中沒有“\n”字符或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。

s(PCRE_DOTALL)
如果設定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。沒有此設定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字符類例如 [^a] 總是匹配換行符的,無論是否設定了此修正符。

x(PCRE_EXTENDED)
如果設定了此修正符,模式中的空白字符除了被轉義的或在字符類中的以外完全被忽略,在未轉義的字符類之外的 # 以及下一個換行符之間的所有字符,包括兩頭,也都被忽略。這和 Perl 的 /x 修正符是等效的,使得可以在複雜的模式中加入註釋。然而注意,這僅適用于數據字符。空白字符可能永遠不會出現于模式中的特殊字符序列,例如引入條件子模式 的序列 (?( 中間。

e
如果設定了此修正符,preg_replace() 在替換字元串中對逆向引用作正常的替換,將其作為 PHP 代碼求值,並用其結果來替換所搜索的字元串。

只有 preg_replace() 使用此修正符,其它 PCRE 函數將忽略之。

注: 本修正符在 PHP3 中不可用。

A(PCRE_ANCHORED)
如果設定了此修正符,模式被強製為“anchored”,即強製僅從目標字元串的開頭開始匹配。此效果也可以透過適當的模式本身來實現(在 Perl 中實現的唯一方法)。

D(PCRE_DOLLAR_ENDONLY)
如果設定了此修正符,模式中的美元元字符僅匹配目標字元串的結尾。沒有此選項時,如果最後一個字符是換行符的話,美元符號也會匹配此字符之前(但不會匹配任何其它換行符之前)。如果設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。

S
當一個模式將被使用若干次時,為加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY)
本修正符反轉了匹配數量的值使其不是默認的重複,而變成在后面跟上“?”才變得重複。這和 Perl 不兼容。也可以透過在模式之中設定 (?U) 修正符或者在數量符之后跟一個問號(如 .*?)來啟用此選項。

X(PCRE_EXTRA)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線后面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。默認情況下,和 Perl 一樣,一個反斜線后面跟一個沒有特殊意義的字母被當成該字母本身。當前沒有其它特性受此修正符控制。

u(PCRE_UTF8)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字元串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。

有一篇回應

有一篇回應 to “PHP的正規表達式”

  1. Starg 說道:

    找資料找到此篇

    謝謝, 正規表示困擾我許久

給個回應吧

(若看不到驗證碼,請重新整理網頁。)