我們在製作網站的時候,尤其是各種電子商務網站,首先都會讓使用者填寫一些表格來擷取註冊使用者的各種資訊,因為使用者有可能輸入各式各樣的資訊,而有些不符合要求的資料會給我們的後端ASP處理常式帶來不必要的麻煩,甚至導致網站出現一些安全問題。因此我們在將這些資訊儲存到網站的資料庫之前,要對這些使用者所輸入的資訊進行資料的合法性校正,以便後面的程式可以安全順利的執行。所以我們一般會在後端編寫一個ASP的校正程式來分析使用者輸入的資料是否是合法的。
或許有人會問了,使用運行在用戶端的JavaScript不是可以更好更快的來校正使用者的資料嗎?的確,這樣在大多的情況下是可以的,為什麼是大多情況下呢?因為你編寫的JavaScript不一定可以完全正常的同時運行在IE以及Netscape上面,因為微軟的Jscript並不全和JavaScript相同,再加上還有一些瀏覽器不一定和微軟以及Netscape相容的很好,所以很有可能在用戶端的Javascript不會精確的校正使用者輸入的各種資料,而ASP程式是運行在伺服器端的,只是和你的伺服器的環境有關,無論用戶端是什麼瀏覽器,對於你的ASP程式來說都是沒有分別的,所以選擇使用後端的ASP程式來進行資料合法性的校正是一個好的選擇。
在使用ASP來進行後端的資料合法性校正的時候,有些人為滿足不同環境下面的資料校正,編寫了很多的函數來實現,比如,我們想要校正使用者輸入的URL 地址是否合法,是可以自己編寫一段代碼來逐個逐個字元的分析使用者輸入的資訊,要分析的資訊量小了,那還比較好辦,若是分析的條件千變萬化,那可就慘了,不但要編寫很長很繁瑣的代碼,而且啟動並執行效率極其低下,有沒有好的解決辦法呢?有,那就是VBScritp5.0提供的“Regex”對象,只要你的伺服器安裝了IE5.x,就會帶VBScript5.0。其實,“Regex”原本是Unix下面的專利,尤其是在Perl語言中使用的最為廣泛,正是由於“Regex”的強大功能,才使得微軟慢慢將Regex對象移植到了視窗系統上面,利用
“Regex”對象,我們就可以非常方便的對各種資料進行合法性的校正了。
首先,讓我們來瞭解一下究竟什麼是VBScript的“Regex”對象,我們先來看一段程式:
Function CheckExp(patrn, strng)
Dim regEx, Match ’ 建立變數。
Set regEx = New RegExp ’ 建立Regex。
regEx.Pattern = patrn ’ 設定模式。
regEx.IgnoreCase = true ’ 設定是否區分字元大小寫。
regEx.Global = True ’ 設定全域可用性。
Matches = regEx.test(strng) ’ 執行搜尋。
CheckExp = matches
End Function
在這段程式程式中,我們看到可以使用“New RegExp”來得到一個Regex對象,然後對這個對象進行正則匹配模板的賦值,也就是告訴Regex對象,你想要匹配一個什麼樣子的模板,然後使用方法Test來檢測待處理的資料究竟和我們給出的模版是否相匹配,如果不匹配,那就表明待處理的資料不是合法的資料,從而也就實現了資料合法性的校正,我們可以看出,使用一個設計合理的匹配模板,我們可以輕鬆的校正一批格式類似的資料資訊。
當然,VBScript5.0中的“Regex”對象還有很多的其他的方法和屬性,比如方法Replace(),利用他我們就可以很快的實現現在網上很時髦的UBB風格的論壇以及BBS,這不在我們討論範圍之內,以後再加以論述,我們現在就看看在資料校正方面Regex對象常用的方法和屬性:
常用方法: Execute 方法
描述:對指定的字串執行Regex搜尋。
文法:object.Execute(string) Execute 方法的文法包括以下幾個部分:
object:必需的。總是一個 RegExp 對象的名稱。
string:必需的。要在其上執行Regex的文本字串。
說明:Regex搜尋的設計模式是通過 RegExp 對象的 Pattern 來設定的。Execute 方法返回一個
Matches 集合,其中包含了在 string 中找到的每一個匹配的 Match 對象。如果未找到匹配,Execute 將返回空的 Matches 集合。
Test方法
描述:對指定的字串執行一個Regex搜尋,並返回一個 Boolean 值指示是否找到匹配的模式。
文法:object.Test(string)
Test 方法的文法包括以下幾個部分:
object:必需的。總是一個 RegExp 對象的名稱。
string:必需的。要執行Regex搜尋的文本字串。
說明:Regex搜尋的實際模式是通過RegExp對象的Pattern屬性來設定的。RegExp.Global屬性對Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。
常用屬性: Global屬性
描述:設定或返回一個 Boolean 值,該值指明在整個搜尋字串時模式是全部匹配還是只匹配第一個。
文法:object.Global [= True | False ]
object 參數總是 RegExp 對象。如果搜尋應用於整個字串,Global 屬性的值為 True,否則其值為 False。預設的設定為 True。
IgnoreCase屬性
描述:設定或返回一個Boolean值,指明模式搜尋是否區分大小寫。
文法:object.IgnoreCase [= True | False ]
object 參數總是一個 RegExp 對象。如果搜尋是區分大小寫,則 IgnoreCase 屬性為 False;否則為 True。預設值為 True。
Pattern屬性
描述:設定或返回被搜尋的Regex模式。 這是一個最重要的屬性,我們主要是設定這個屬性來實現資料校正的。
文法:object.Pattern [= "searchstring"]
Pattern 屬性的文法包含以下幾個部分:
object:必需的。總是一個 RegExp 物件變數。
searchstring:可選的。被搜尋的正則字串運算式。它可能包含設定部分表格中的各種Regex字元。
設定:在書寫Regex的模式時使用了特殊的字元和序列。下表描述了可以使用的字元和序列,並給出了執行個體。
字元描述: /:將下一個字元標記為特殊字元或字面值。例如"n"與字元"n"匹配。"/n"與分行符號匹配。序列"//"與"/"匹配,"/("與"("匹配。
^ :匹配輸入的開始位置。
$ :匹配輸入的結尾。
* :匹配前一個字元零次或幾次。例如,"zo*"可以匹配"z"、"zoo"。
+ :匹配前一個字元一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
? :匹配前一個字元零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。
.:匹配分行符號以外的任何字元。
(pattern) 與模式比對並記住匹配。匹配的子字串可以從作為結果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括弧字元(和 ),可使用"/(" 或 "/)"。
x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。
:n 為非負的整數。匹配恰好n次。例如,"o" 不能與 "Bob 中的 "o" 匹配,但是可以與"foooood"中的前兩個o匹配。
:n 為非負的整數。匹配至少n次。例如,"o"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o"等價於"o+"。"o"等價於"o*"。
:m 和 n 為非負的整數。匹配至少 n 次,至多 m 次。例如,"o" 匹配 "fooooood"中前三個o。"o"等價於"o?"。
[xyz] :一個字元集。與括弧中字元的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。
[^xyz] :一個否定的字元集。匹配不在此括弧中的任何字元。例如,"[^abc]" 可以匹配"plain"中的"p".
[a-z] :表示某個範圍內的字元。與指定區間內的任何字元匹配。例如,"[a-z]"匹配"a"與"z"之間的任何一個小寫字母字元。
[^m-z] :否定的字元區間。與不在指定區間內的字元匹配。例如,"[m-z]"與不在"m"到"z"之間的任何字元匹配。
/b :與單詞的邊界匹配,即單詞與空格之間的位置。例如,"er/b" 與"never"中的"er"匹配,但是不匹配"verb"中的"er"。
/B :與非單詞邊界匹配。"ea*r/B"與"never early"中的"ear"匹配。
/d :與一個數字字元匹配。等價於[0-9]。
/D :與非數位字元匹配。等價於[^0-9]。
/f :與分頁符匹配。
/n :與分行符號字元匹配。
/r :與斷行符號字元匹配。
/s :與任何白字元匹配,包括空格、定位字元、分頁符等。等價於"[ /f/n/r/t/v]"。
/S :與任何非空白的字元匹配。等價於"[^ /f/n/r/t/v]"。
/t :與定位字元匹配。
/v :與垂直定位字元匹配。
/w :與任何單詞字元匹配,包括底線。等價於"[A-Za-z0-9_]"。
/W :與任何非單詞字元匹配。等價於"[^A-Za-z0-9_]"。
/num :匹配 num個,其中 num 為一個正整數。引用回到記住的匹配。例如,"(.)/1"匹配兩個連續的相同的字元。
/n:匹配 n,其中n 是一個八進位換碼值。八進位換碼值必須是 1, 2 或 3 個數字長。
例如,"/11" 和 "/011" 都與一個定位字元匹配。"/0011"等價於"/001" 與 "1"。八進位換碼值不得超過 256。否則,只有前兩個字元被視為運算式的一部分。允許在Regex中使用ASCII碼。
/xn:匹配n,其中n是一個十六進位的換碼值。十六進位換碼值必須恰好為兩個數字長。例如,"/x41"匹配"A"。"/x041"等價於"/x04" 和 "1"。允許在Regex中使用 ASCII 碼。
好了,常用的方法和屬性就是這些了,上面的文法介紹的已經很詳細了,我們就沒有必要在羅嗦了,接下來我們來看看在具體的例子裡面如何使用這些方法和屬性來校正資料的合法性,我們還是舉個例子吧,比如,我們想要對使用者輸入的電子郵件進行校正,那麼,什麼樣的資料才算是一個合法的電子郵件呢?我可以這樣輸入:uestc95@263.net,當然我也會這樣輸入:xxx@yyy.com.cn,但是這樣的輸入就是非法的:xxx@@com.cn或者@xxx.com.cn,等等,所以我們得出一個合法的電子郵件地址至少應當滿足以下幾個條件:
1. 必須包含一個並且只有一個符號“@”
2. 必須包含至少一個至多三個符號“.”
3. 第一個字元不得是“@”或者“.”
4. 不允許出現“@.”或者.@
5. 結尾不得是字元“@”或者“.”
所以根據以上的原則和上面表中的文法,我們很容易的就可以得到需要的模板如下:"(/w)+[@](/w)+[.](/w)+"
接下來我們仔細分析一下這個模板,首先“/w”表示郵件的開始字元只能是包含底線的單詞字元,這樣,滿足了第三個條件;“[@]”表示在電子郵件中應當匹配並且只能匹配一次字元“@”,滿足了條件一;同樣的“[.]”表示在電子郵件中至少匹配1個至多匹配3個字元“.” ,滿足了第二個條件;模板最後的“(/w)+”表示結尾的字元只能是包含底線在內的單詞字元,滿足了條件五;模板中間的“(/w)+”滿足了條件四。
然後,我們就直接調用剛才的那個函數CheckExp("(/w)+[@](/w)+[.](/w)+",待校正的字串)就好了,如果返回True就表示資料是合法的,否則就是不正確的,怎麼樣,簡單吧。我們還可以寫出來校正社會安全號碼碼的模板:"([0-9])";校正URL的模板:"^http://((/w)+[.])"等等;我們可以看到,這些模板為我們提供了很好的可重利用的模組,利用自己或者別人提供的各種模板,我們就可以方便快捷的進行資料的合法性校正了,相信你一定會寫出非常通用的模板的。
這樣,我們只要定製不同的模板,就可以實現對不同資料的合法性校正了。所以,Regex對象中最重要的屬性就是:“Pattern”屬性,只要真正掌握了這個屬性,才可以自由的運用Regex對象來為我們的資料校正進行服務。</DIV><DIV class=postbody> </DIV><DIV class=postbody>-------------------------------------------</DIV><DIV class=postbody>RegExp對象提供簡單的Regex支援功能。
RegExp對象的用法:
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ' 建立變數。
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = True ' 設定是否區分字元大小寫。
regEx.Global = True ' 設定全域可用性。
Set Matches = regEx.Execute(strng) ' 執行搜尋。
For Each Match in Matches ' 遍曆匹配集合。
RetStr = RetStr & "Match found at position "
RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
RetStr = RetStr & Match.Value & "'." & vbCRLF
Next
RegExpTest = RetStr
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
RegExp 對象的屬性
◎ Global屬性
Global屬性設定或返回一個 Boolean 值,該值指明在整個搜尋字串時模式是全部匹配還是只匹配第一個。
文法
object.Global [= True | False ]
object 參數總是 RegExp 對象。如果搜尋應用於整個字串,Global 屬性的值為 True,否則其值為 False。預設的設定為 True。
Global 屬性的用法(改變賦予 Global 屬性的值並觀察其效果):
Function RegExpTest(patrn, strng)
Dim regEx ' 建立變數。
Set regEx = New RegExp ' 建立規範運算式。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = True ' 設定是否區分字母的大小寫。
regEx.Global = True ' 設定全程性質。
RegExpTest = regEx.Execute(strng) ' 執行搜尋。
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
◎ IgnoreCase屬性
IgnoreCase屬性設定或返回一個Boolean值,指明模式搜尋是否區分大小寫。
文法
object.IgnoreCase [= True | False ]
object 參數總是一個 RegExp 對象。如果搜尋是區分大小寫,則 IgnoreCase 屬性為 False;否則為 True。預設值為 True。
IgnoreCase 屬性的用法(改變賦予 IgnoreCase 屬性的值以觀察其效果):
Function RegExpTest(patrn, strng)
Dim regEx ' 建立變數。
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = True ' 設定是否區分大小寫。
RegExpTest = regEx.Execute(strng) ' 執行搜尋。
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
◎ Pattern屬性
Pattern屬性設定或返回被搜尋的Regex模式。
文法
object.Pattern [= "searchstring"]
Pattern 屬性的文法包含以下幾個部分:
文法說明:
object 必需的。總是一個 RegExp 物件變數。
searchstring 可選的。被搜尋的正則字串運算式。它可能包含設定部分表格中的各種Regex字元。
設定
在書寫Regex的模式時使用了特殊的字元和序列。下面描述了可以使用的字元和序列,並給出了執行個體。
/ 將下一個字元標記為特殊字元或字面值。例如"n"與字元"n"匹配。"/n"與分行符號匹配。序列"//"與"/"匹配對面,"/("與"("匹配。
^ 匹配輸入的開始位置。
$ 匹配輸入的結尾。
* 匹配前一個字元零次或幾次。例如,"zo*"可以匹配"z"、"zoo"。
+ 匹配前一個字元一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
? 匹配前一個字元零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。
. 匹配分行符號以外的任何字元。
(pattern) 與模式比對並記住匹配。匹配的子字串可以從作為結果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括弧字元(和 ),可使用"/(" 或 "/)"。
x|y 匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。
{n} n 為非負的整數。匹配恰好n次。例如,"o{2}" 不能與 "Bob 中的 "o" 匹配,但是可以與"foooood"中的前兩個o匹配。
{n,} n 為非負的整數。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等價於"o+"。"o{0,}"等價於"o*"。
{n,m} m 和 n 為非負的整數。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三個o。"o{0,1}"等價於"o?"。
[xyz] 一個字元集。與括弧中字元的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。
[^xyz] 一個否定的字元集。匹配不在此括弧中的任何字元。例如,"[^abc]" 可以匹配"plain"中的"p".
[a-z] 表示某個範圍內的字元。與指定區間內的任何字元匹配。例如,"[a-z]"匹配"a"與"z"之間的任何一個小寫字母字元。
[^m-z] 否定的字元區間。與不在指定區間內的字元匹配。例如,"[m-z]"與不在"m"到"z"之間的任何字元匹配。
/b 與單詞的邊界匹配,即單詞與空格之間的位置。例如,"er/b" 與"never"中的"er"匹配,但是不匹配"verb"中的"er"。
/B 與非單詞邊界匹配。"ea*r/B"與"never early"中的"ear"匹配。
/d 與一個數字字元匹配。等價於[0-9]。
/D 與非數位字元匹配。等價於[^0-9]。
/f 與分頁符匹配。
/n 與分行符號字元匹配。
/r 與斷行符號字元匹配。
/s 與任何白字元匹配,包括空格、定位字元、分頁符等。等價於"[ /f/n/r/t/v]"。
/S 與任何非空白的字元匹配。等價於"[^ /f/n/r/t/v]"。
/t 與定位字元匹配。
/v 與垂直定位字元匹配。
/w 與任何單詞字元匹配,包括底線。等價於"[A-Za-z0-9_]"。
/W 與任何非單詞字元匹配。等價於"[^A-Za-z0-9_]"。
/num 匹配 num個,其中 num 為一個正整數。引用回到記住的匹配。例如,"(.)/1"匹配兩個連續的相同的字元。
/n 匹配 n,其中n 是一個八進位換碼值。八進位換碼值必須是 1, 2 或 3 個數字長。例如,"/11" 和 "/011" 都與一個定位字元匹配。"/0011"等價於"/001" 與 "1"。八進位換碼值不得超過 256。否則,只有前兩個字元被視為運算式的一部分。允許在Regex中使用ASCII碼。
/xn 匹配n,其中n是一個十六進位的換碼值。十六進位換碼值必須恰好為兩個數字長。例如,"/x41"匹配"A"。"/x041"等價於"/x04" 和 "1"。允許在Regex中使用 ASCII 碼。
Pattern 屬性的用法:
Function RegExpTest(patrn, strng)
Dim regEx ' 建立變數。
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = True ' 設定是否區分大小寫。
RegExpTest = regEx.Execute(strng) ' 執行搜尋。
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
RegExp對象的方法
◎ Execute方法
Execute方法對指定的字串執行Regex搜尋。
文法
object.Execute(string)
文法部分描述
object 必需的。總是一個 RegExp 對象的名稱。
string 必需的。要在其上執行Regex的文本字串。
說明
Regex搜尋的設計模式是通過 RegExp 對象的 Pattern 來設定的。
Execute 方法返回一個 Matches 集合,其中包含了在 string 中找到的每一個匹配的 Match 對象。如果未找到匹配,Execute 將返回空的 Matches 集合。
Execute 方法的用法:
Function RegExpTest(patrn, strng)
Dim regEx ' 建立變數。
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = False ' 設定區分大小寫。
regEx.Global = True ' 搜尋全部匹配。
RegExpTest = regEx.Execute(strng) ' 執行搜尋。
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
◎ Replace方法
Replace方法替換在Regex尋找中找到的文本。
文法
object.Replace(string1, string2)
文法部分描述
object 必需的。總是一個 RegExp 對象的名稱。
string1 必需的。string1 是將要進行文本替換的字串。
string2 必需的。 string2 是替換文本字串。
說明
被替換的文本的實際模式是通過 RegExp 對象的 Pattern 屬性設定的。
Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已經被替換為 string2。如果沒有找到匹配的文本,將返回原來的 string1 的副本。
eplace 方法的用法:
Function ReplaceTest(patrn, replStr)
Dim regEx, str1 ' 建立變數。
str1 = "The quick brown fox jumped over the lazy dog."
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = True ' 設定是否區分大小寫。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替換。
End Function
MsgBox(ReplaceTest("fox", "cat"))
' 將 'fox' 替換為 'cat'。
;另外,Replace 方法在模式中替換 subexpressions 。 下面對以前樣本中函數的調用,替換了原字串中的所有字對:
MsgBox(ReplaceText("(/S+)(/s+)(/S+)", "$3$2$1")) ' Swap pairs of words.
◎ Test方法
Test方法對指定的字串執行一個Regex搜尋,並返回一個 Boolean 值指示是否找到匹配的模式。
文法
object.Test(string)
文法部分描述
object 必需的。總是一個 RegExp 對象的名稱。
string 必需的。要執行Regex搜尋的文本字串。
說明
Regex搜尋的實際模式是通過RegExp對象的Pattern屬性來設定的。RegExp.Global屬性對Test方法沒有影響。
如果找到了匹配的模式,Test方法返回True;否則返回False。
Test 方法的用法:
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立變數。
Set regEx = New RegExp ' 建立Regex。
regEx.Pattern = patrn ' 設定模式。
regEx.IgnoreCase = False ' 設定是否區分大小寫。
retVal = regEx.Test(strng) ' 執行搜尋測試。
If retVal Then
RegExpTest = "找到一個或多個匹配。"
Else
RegExpTest = "未找到匹配。"
End If
End Function
MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4")) </DIV>