PHP之正則表達式入門

正則表達式(英文:Regular expression_r)在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。許多程序設計語言都支持利用正則表達式進行字符串操作,包括查找符合某些複雜規則的字符串。正則表達式提供了一種高級的,但不直觀的字符串匹配和處理的方法,其功能非常強大。在web應用的邏輯判斷中具有比較重要的作用。譬如驗證郵箱地址的正確性、搜索特定字符串等常見應用。

既然這是一種表達式,當然它們需要具備一定的規則,這樣人們才能按照統一的標準去查找去使用它們。下面我們從最基本的規則來說起,跟數學裏加減乘除括號等的用法類似。我們入門先從模式和字符簇學起。

一、模式

一切從最基本的開始,就像數學先學數字一樣,我們先看基本模式匹配。模式,是正規表達式最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成(就像1就是1,2就是2),也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文(譬如輸入法裏面*可以代表任意字母一樣)。

我們一個個的看:

1、前匹配:^
如^one與字符串"one man"匹配,與"There is one man"不匹配。也就是說該模式只匹配那些以one開頭的字符串。

2、後匹配:$
跟^類似,$符號用來匹配那些以給定模式結尾的字符串。
如bucket$與"Who kept all of this cash in a bucket"匹配,與"buckets"不匹配。                                                  


3、精確匹配:^+$
字符^和$同時使用時,表示精確匹配(僅匹配^和$中間的字符)。如:^one$與"ones"和"loveone"等都不匹配。

4、任意匹配:不使用^、$等特殊字符
如果一個模式不包括^和$,那麼它與任何包含該模式的字符串匹配。如:once,只有給定的語句中含有once,就與之匹配。


上面的模式中的字母(o-n-e)表示的是該字母或者數字本身,但是對於其他一些稍微複雜的字符,如標點符號和白字符(空格、製表符等)如何匹配呢?繼續看^_^

5、特殊字符的匹配:需要用到轉義序列
所有的轉義序列都用反斜槓(/)打頭。如製表符的轉義序列是:/t。所以如果我們要檢測一個字符串是否以製表符開頭,可以用這個模式:^/t

類似的,/n表示新行,/r表示回車等等。其他轉義字符大家可以自行查閱資料。

 

二、字符簇:使用[]

在很多程序中,正規表達式通常用來驗證用戶的輸入。例如判斷電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基於模式的字符是不夠的。所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。

使用字符簇之前需要明白待驗證輸入的特點,譬如電話號碼是全數字的,是否帶有區號或者分機號等等不同的情況。

1、如果我們要匹配所有數字,我們可以使用[0123456789],當然[]合起來只是代表一個字符,譬如^[0123456789]$就只是匹配所有的一位數數字了。當然,我們可以簡單的使用連字號“-”表示一個字符的範圍,如:
[0-9]:可以代替[0123456789]匹配所有的數字
[a-z]:匹配所有的小寫字母
[A-Z]:匹配所有的大寫字母
[a-zA-Z]:匹配所有的字母
[0-9/./-]:匹配所有的數字、句號和減號
[ /f/r/t/n]:匹配所有的白字符

需要注意的是,這些都只表示一個字符,這是一個非常重要的。如果要匹配2位數字,可以使用^[0-9][0-9]$


2、前面曾經提到^表示匹配字符串的開頭,但它還有另外一個含義。當在一組方括號裏使用^是,它表示“非”或“排除”的意思,常常用來剔除某個字符。如匹配非數字使用[^0-9]。下面是幾個排除特定字符的例子:
[^a-z]:匹配除了小寫字母以外的所有字符
[^/////^]:匹配除了(/)(/)(^)之外的所有字符
[^/"/']:匹配除了雙引號(")和單引號(')之外的所有字符


3、特殊字符"." (點,句號)在正規表達式中用來表示除了“新行”之外的所有字符。所以模式^.5$與任何兩個字符的、以數字5結尾和以其他非“新行”字符開頭的字符串匹配。

4、PHP的正規表達式有一些內置的通用字符簇,大家可以作爲了解,列表如下:
[[:alpha:]] 任何字母
[[:digit:]] 任何數字
[[:alnum:]] 任何字母和數字
[[:space:]] 任何白字符
[[:upper:]] 任何大寫字母
[[:lower:]] 任何小寫字母
[[:punct:]] 任何標點符號
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]


最後給大家一個可以測試是否匹配的PHP語句,非常簡單,用if語句即可,代碼如下:
<?php
$a="待驗證的輸入";
if(ereg("匹配的模式",$a)){
 echo "匹配";
}else{
 echo "不匹配";
}
?>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章