正則表達式在網頁處理中的應用
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
正則表達式(Regular Expression)為字符串模式匹配提供了一種高效、方便的方法。幾乎所有高級語言都提供了對正則表達式的支持,或者提供了現成的代碼庫供調用。本文以ASP環境中常見的處理任務為例,介紹正則表達式的應用技巧。
一、檢驗密碼和郵件地址的格式 我們的第一個實例示范正則表達式的一項基本功能:抽象地描述任意復雜的字符串。它的意思就是,正則表達式給予程序員一種形式化的字符串描述方法,只需很少的代碼即可描述出應用遇到的任意字符串模式。例如,對于不從事技術工作的人來說,密碼格式的要求可以描述如下:密碼的第一個字符必須是字母,密碼最少4個字符且不超過15個字符,密碼不能包含除字母、數字和下劃線以外的字符。 作為程序員,我們必須把上面對密碼格式的自然語言描述轉換成其他形式,使得ASP頁面能夠理解并應用它來防止非法的密碼輸入。描述這個密碼格式的正則表達式是:^[a-zA-Z]\w{3,14}$。 在ASP應用里,我們可以把密碼驗證過程寫成可重用的函數,如下所示: Function TestPassword(strPassword) Dim re Set re = new RegExp re.IgnoreCase = false re.global = false re.Pattern = "^[a-zA-Z]\w{3,14}$" TestPassword = re.Test(strPassword) End Function 下面我們把這個檢驗密碼格式的正則表達式和自然語言描述對比著看看: <% Dim re Set re = new RegExp re.pattern = "^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$" Response.Write re.Test("aabb@yahoo.com") %> 二、提取HTML頁面的特定部分 <table border="0" width="11%" class="Somestory"> <tr> <td width="100%"> <p align="center">其他內容...</td> </tr> </table> <table border="0" width="11%" class="Headline"> <tr> <td width="100%"> <p align="center">伊拉克戰爭!</td> </tr> </table> <table border="0" width="11%" class="Someotherstory"> <tr> <td width="100%"> <p align="center">其他內容...</td> </tr> </table> 觀察上述代碼,很容易看出新聞標題由位于中間的表格顯示,它的class屬性設置為Headline。如果HTML頁面非常復雜,使用Microsoft IE從5.0開始提供的一項附加功能可以只查看被選中部分頁面的HTML代碼,請訪問http://www.microsoft.com/Windows/ie/WebAccess/default.ASP了解詳情。對于本例,我們假定這是唯一class屬性設置為Headline的表格。現在我們要創建正則表達式,通過正則表達式找到這個Headline表格并把這個表格包含到自己的頁面中。首先是編寫支持正則表達式的代碼: <% Dim re, strHTML Set re = new RegExp ' 創建正則表達式對象 re.IgnoreCase = true re.Global = false ' 第一次匹配之后結束查找 %>
' 把所有匹配的HTML代碼放入Matches集合 Set Matches = re.Execute(strHTML) ' 顯示所有匹配的HTML代碼 For Each Item in Matches Response.Write Item.Value Next ' 顯示其中一項 Response.write Matches.Item(0).Value 運行這段代碼處理前面顯示的HTML片斷,正則表達式返回一次匹配的內容如下: <table border="0" width="11%" class="。正則表達式中的“(?=Headline)”沒有獲取字符,所以不能看到表格class屬性的值。要獲取表格剩余部分的代碼也相當簡單: re.Pattern = "<table.*(?=Headline)(.|\n)*?</table>"。其中:“(.|\n)”后面的“*”匹配0個到多個任意字符;而“?”使得“*”匹配范圍最小化,即在找到表達式的下一部分之前匹配盡可能少的字符。</table>是表格的結束標記。 <table border="0" width="11%" class="Headline"> <tr> <td width="100%"> <p align="center">伊拉克戰爭!</td> </tr> </table> <table border="0" width="11%" class="Someotherstory"> <tr> <td width="100%"> <p align="center">其他內容...</td> </tr> </table>
三、解析文本數據文件 姓,名, 電話, 說明 孫,悟空, 312 555 5656, ASP很好 豬,八戒, 847 555 5656, 我是電影制片人
姓,名, 電話, 說明 孫,悟空, 312 555 5656, 我喜歡ASP,還有VB和SQL 豬,八戒, 847 555 5656, 我是電影制片人
姓,名, 電話, 說明 孫,悟空, 312 555 5656, '我喜歡ASP,還有VB和SQL' 豬,八戒, 847 555 5656, '我是電影制片人'
下面是一個VBScript函數,它接受一個字符串參數,根據字符串中的逗號分隔符、單引號限定符分割字符串,返回結果數組: Function SplitAdv(strInput) Dim objRE Set objRE = new RegExp ' 設置RegExp對象 objRE.IgnoreCase = true objRE.Global = true objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))" ' Replace方法用chr(8)替換我們要用到的逗號,chr(8)即\b ' 字符,\b在字符串中出現的可能極為微小。 ' 然后我們根據\b把字符串分割保存到數組 SplitAdv = Split(objRE.Replace(strInput, "\b"), "\b") End Function
<% Set regEx = New RegExp regEx.Global = true regEx.IgnoreCase = True ' 正則表達式模式, ' 尋找任何結尾為“.NET”的單詞或者URL。 regEx.Pattern = "(\b[a-zA-Z\._]+?\.NET\b)" ' 用于測試替換功能的字符串 strText = "微軟建立了一個新網站www.ASP.NET。" ' 調用正則表達式的Replace方法 ' $1表示把匹配的文本插入當前位置 Response.Write regEx.Replace(strText, _ "<b style='color: #000099; font-size: 18pt'>$1</b>") %>
該文章在 2011/2/1 13:23:56 編輯過 |
關鍵字查詢
相關文章
正在查詢... |