三、 處理常規表達式
我們稍微講講用ereg()和eregi()兩個函數處理常規表達式。前面我已經提過,這些函數有的很簡單,有的很復雜,看您的實際需要而定。
使用常規表達式,您可以對一個字符串進行檢查,搜索其中的一些結構模式,判定這些模式是否滿足您的規定。最普遍的用法包括檢查電子郵件地址是否有效(當然,即使這種辦法判定有效,也不能保證郵件地址真的存在)。
我們在這裡不細究常規表達式的復雜細節了,僅僅給出幾個實例。您可以使用上一頁中用過的表格 - 把相應的程序代碼復制過來,添加到下面的代碼段中,就可以看到它是怎樣工作的。
首先,我們要確保表格中各欄只能輸入字母。下面的常規表達式在用戶輸入一個或多個小寫字母時判定為真,而輸入數字是不允許的:
if (!ereg("[a-Z]", $first) || !ereg("[a-Z]", $last)) {
現在我們更進一步,檢查字符串的長度是否是四到六位字符長。用[[:alpha:]]是檢查字符是不是字母的簡單方式。大括號內的數字檢查字符個數。還要說明的是,^ 和 $ 分別代表字符串的開始和結束。
if (!ereg("^[[:alpha:]]{4,6}$", $first) || !ereg("^[[:alpha:]]{4,6}$", $last)) {
最後,我們來構造一個常規表達式,來檢驗電子郵件地址的有效性。這種檢驗方式的效果已經引發了相當多的討論。沒有什麼東西是十全十美的,不過我下面給出的這段程序還是十分奏效的。
別花太多時間來細究這段代碼了,還是先到下一頁內容吧。
四、 簡便方法
前面的常規表達式怎麼樣?很有意思,是吧?要是在每個需要檢查電子郵件地址的程序裡都寫上這麼一段程序,那才真叫有意思呢?!想想看吧,得寫那麼亂七八糟的一段程序,還得寫上那麼多遍!...不過,當然了,還有更簡便的方法。
還記得前面? 學過的頭文件嗎?它能讓我們寫一段程序,象是這個電子郵件地址的檢查程序,然後把這段程序包含進多個程序裡面去。這樣,我們要改寫這段程序時,只須改動一處就行了,不用修改多個文件。
但是,要做到這一點,我們必須用到函數。
我們已經用過很多次函數了。每次我們查詢數據庫或檢查字符串長度時,我們都是用函數來做的。這些函數是PHP自帶的。如果您是位熱心的程序員,您可以用自己編寫的函數來擴充PHP本身的功能。但對本教程而言,這部分內容是太過高深了一點。我們要創建的函數不是那一種,而是寫在PHP腳本程序內部的函數。
函數就是一段程序代碼,我們可以把一個或多個值傳給這段代碼,然後這段代碼會處理我們傳給它的數據並返回一個值。根據實際需要,函數可以很簡單,也可以十分復雜。但是只要我們傳進去一個數,然後能得到一個數,您管它裡面有是復雜還是簡單呢!這就是函數的可愛之處。
PHP裡的函數與C語言裡的函數表現差不多。當我們定義函數時,必須指明函數需要接收什麼樣的數據。一開始好象不太好理解為什麼它要接收數據進去,不過這樣可以防止發生一些怪異的問題。函數之所以能做到這一點,是因為函數裡面的變量都是私有變量,也就是說,它只在該函數內部存在。例如,您在程序中有一個變量叫$myname,如果您創建了一個函數,想讓這個函數也使用那個$myname變量(值也相同),那是不行的。您可以在函數內部創建一個變量,名字也叫$myname,這兩個變量可以各平相處,而各自取不同的值。不過我可不建議您這麼做!您如果真的這麼做了,等半年後您再來修改這樣的程序時,您可能就會被弄糊塗了。
那我們現在就來創建一個函數,先來個簡單的。我們要給它取個名字,指定它要接收什麼的變量。在調用這個函數之前,我們還得定義這個函數。
這就行了!首先,我們創建了第一個自己的函數。我們定義了兩個新變量,$first和$second,注意它們是怎樣被定義的。在調用這個函數時,要給這兩個變量按它們出現的順序賦好值 - 4賦給$first,5賦給$second。然後我們簡單地把這兩個數加在一起,返回結果。“返回”在這裡的意思是把結果送回去。在程序最後部分我們把數字9顯示出來。
我們再來創建一個函數,讓它對我們的數據庫應用有點幫助。一個能妥善處理錯誤的函數怎麼樣?試試下面的程序:
本新聞共2頁,當前在第1頁 1 2
在運行程序之前,試試關閉MySQL數據庫,或使用錯誤的用戶名或口令。您會看到友好的、有用的錯誤信息 。細心的朋友會注意到在mysql_connect()函數之前的那個@符號。它會抑制系統錯誤信息,使得程序只能從do_error()函數那裡得到有關的錯誤信息。您還會注意到,我們可以把一個在別處定義的變量作為參數傳給函數,而不是在調用時直接賦一個值。
還記得我過函數使用的是私有變量吧?這話說得不完全對。事實上,您可以讓函數訪問到函數外面的變量。您可能要寫一個函數,用它來查詢數據庫,然後把結果顯示在多個網頁中。您不想每次都把數據庫連接標識都傳給函數。在這種情況下,您可以把連接標識定義成一個全局的變量。例如:
這是個很簡單的函數,但重要的是,您在調用這個函數時,不必傳遞$db變量 - 您可以通過 global這個字使得函數可以訪問到該變量。在這條語句中您可以定義多個全局變量,各個全局變量之間用逗號隔開。
最後,您可以使用可選參數,這樣看起來您已經是真正的專家了。這裡面關鍵的一點是,在函數中定義參數時要給它指定一個缺省值。然後您在調用這個函數時,如果不為該參數變量指定其他值,那麼函數會自動把缺省值賦給這個變量。如果您指定了其他值,那麼缺省值就不起作用了。
不太明白?比方說,您在連接數據庫時,幾乎總是連接到相同的服務器,並且使用相同的用戶名和口令。不過有時候,您也需要連接到其他的服務器。看看下面的程序: