編程|網路|正則 應用執行個體
在對Regex有了較為全面的瞭解之後,就可以在Perl,PHP,以及ASP等程式中使用Regex了。
下面以PHP語言為例,使用驗證使用者線上輸入的郵件地址以及網址的格式是否正確。PHP 提供了eregi()或ereg()資料處理函數實現字串比對剖析的模式比對操作ereg()函數的使用格式如下:
ereg (pattern, string)
其中,pattern代表Regex的模式;而string則是執行尋找替換操作的目標對象,如Email地址值。本函式以 pattern 的規則來剖析比對字串 string,找到則傳回值為 true。函式ereg()與eregi()的區別就是前者區分大小寫,後者與大小寫無關。使用PHP編寫的程式碼如下:
<?php
if (ereg("^([a-z0-9_-])+@([a-zZ0-9_-])+(\.[a-z0-9_-])+[a-z]{2,3}$",$email))
{ echo "您的 E-Mail 通過初步檢查!";}
else
{ echo "不是合法的E-Mail 地址,請重新輸入!";}
?>
這個例子是可對使用者輸入的 E-Mail 作簡單的檢查,檢查使用者的 E-Mail 字串是否有 @ 字元,在 @ 字元前有小寫英文字母、數字或下"_",在 @ 之後有數節字串,最後的小數點後只能有二個或三個小寫英文字母。如webmaster@mail.sever.net, hello_2001@88new.cn就可以通過檢查,而New99@253.com(出現大寫字母)和new99@253.comn(最後的小數點後只能超過3個英文字母)就不能通過檢查。
我們通過調用自訂正規則判別函式也可以進行檢查操作,如下面的網址檢驗函式:
function VerifyWebSiteAddr ($strWebSiteAddr){
return (eregi ("^([_0-9a-z-]+.)+([0-9a-z-]+.)+[a-z]{2,3}$", $strWebSiteAddr));
}
我們知道,PHP程式的運行必須有伺服器支援,如果您在自己的首頁上想實現以上功能, 嵌入式指令碼語言Javascript或許是好的選擇。JavaScript中帶有一個功能強大的RegExp()對象,可以用來進行Regex的匹配操作。其中的test()方法可以檢驗目標對象中是否包含匹配模式,並相應的返回true或false。只須在HTML文檔的<head>地區添加一段Javascript代碼。
< language="Javascript1.2">
function verifyAddress(obj){
var email = obj.email.value;
var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
flag = pattern.test(email);
if(flag){
alert("您的 E-Mail 通過初步檢查!");
return true;}
else{
alert("不是合法的E-Mail 地址,請重新輸入!");
return false;}
}
</script>
然後在網頁中輸入資訊的表單域<form>標籤地區內中加入一行如下代碼:
<onSubmit="return verifyAddress(this);">
當按下提交按鈕後,首先運行verifyAddress()函式,進行匹配識別,如果滿足條件則發送表單資訊到目標頁面,否則返回錯誤資訊。
事實上,Regex的功能遠非本文提到的這一點,下次,給大家介紹一種使用Regex從任意指定網頁中析取任意種類文本資訊(如網頁中所有的圖片檔案名稱)的技巧。
Html源檔案中image標籤的析取
上篇,我們介紹了Regex的概念及其在網路編程中使用Regex驗證使用者線上輸入的郵件地址以及網址的格式是否正確的應用執行個體,今天介紹一種從指定網頁源檔案中析取image標籤的的編程技巧,即從網頁源檔案中,解析出所有的插圖檔案名稱(包括圖片路徑),也就是標籤<img src=http://www.163design.net/a/z/"....abc.jpg"> 中的檔案名稱http://www.163design.net/a/z/"....abc.jpg"(有的可能是gif格式)。編程環境:PHP+Apache for Win98。
首先, 用文字編輯器建立一個PHP類型的檔案:abstractSRCfrompage.php3。為了方便講解,我們打算是在瀏覽器表單域中輸入需要析取image標籤的網頁的URL(或本機文檔),提交後執行析取操作,所以在該檔案中,我們要建立一個用於輸入網址的表單,舉例如下:
<form action=" abstractSRCfrompage.php3" method="post">
輸入網址<input type=text name=filename><br>
<input type=submit name=submit value="提交">
</form>
輸入正確的網址,提交後表單資訊被送到abstractSRCfrompage.php3頁面,由於表單本身就在該頁面,所以相當於被送到自身頁面,下面我們需要編寫析取處理的PHP代碼,緊接著表單程式碼片段後寫入如下代碼:
<?php
if ($filename!=""){
$fp = fopen($filename, "r"); file://若輸入不為空白,開啟本地或者遠程檔案;
while ($buffer = fgets($fp, 1024)) {
$source .=$buffer; }
fclose($fp);
file://尋找$source中是否有<img ...src=http://www.163design.net/a/z/".....gif | jpg"> 這樣的標記
if(eregi("(<img)+[^<>]+(src=\")+[^\*\"<>|]+(\.)+((gif)|(jpg))+(\")",$source)) {
echo "找到圖片標籤:)<br>";}
else{
echo "未發現圖片標籤:(<br>";}
file://拆分,第一次用標籤,<img ...src=拆分,得到了以圖形檔案名稱開頭的數組,
$splitres=split("((\">)|())+(<img)+[^<>]+(src=\")",$source);
echo "找到: $imagenums-1個圖片<br>分別為:<br>";
for($i=1;$i<sizeof($splitres);$i++){
file://二次拆分,用"拆分。因為檔案名稱能含有",得到的拆分數組的第一個元素就是路徑+檔案名稱了;
unset($imgname); // 再次使用前刪除imgname變數;
$imgname=spliti("\"",$splitres[$i]);//將析取的圖片資訊依次賦給imgname變數
echo "$i=>".$imgname[0]."<br>"; file://輸出析取的圖片資訊
}
}
?>
該段程式的設計思路是:PHP程式判斷是否輸入了設定檔名稱(網址URL或本機檔案名),若不為空白則以唯讀方式開啟該檔案;接著使用函式fgets(fp,length)取得檔案指標fp所指的行並傳回該行內長度為length-1 的字串,上例中就是1024-1=1023;然後利用字串比對剖析函式ereg()尋找$source中是否含有<img ...src=http://www.163design.net/a/z/".....gif | jpg"> 這樣的標記(關於該函式在上篇中有詳細的介紹);假如找到的話,則利用split()函式按一定的規則執行兩次拆分,去掉標記中的<img…src=字元和"字元,結果得到數組splitres,其中的每一個元素都是以圖形路徑+檔案名稱開頭的數組;用for迴圈在螢幕上輸出每個數組的第一個元素值,即我們所需要的所有圖形路徑+檔案名稱。
其中函式sizeof($splitres)返回個數;在for迴圈中,依次將數組splitres的每個元素(也是數組)賦給陣列變數imgname,並輸出imgname的第一個元素值(為找到的一個圖形路徑+檔案名稱),當執行下次迴圈時,刪除變數imgname,達到重複使用的目的。大家可以仔細研究其中的奧妙。
好了,寫好後,將abstractSRCfrompage.php3存到你的伺服器指定目錄下,啟動Apache伺服器,在瀏覽器中開啟它,隨便輸入一個存在的網頁名稱或是遠程URL,看看效果如何。
如果有興趣,你可以嘗試析取HTML文檔中的任意感興趣的資訊,如果稍加改裝,做一個網站文本搜尋引擎豈不更妙?