在之前的文章中給大家?guī)砹恕禤HP表單學習之怎樣驗證表單中的必需字段?》,其中詳細的介紹了PHP中怎樣驗證表單中的必需字段的相關(guān)知識,本篇文章我們繼續(xù)來看一下,怎樣驗證表單中的郵件和URL。希望對大家有幫助!
在上一篇文章中我們已經(jīng)了解到了怎樣去驗證必填的信息也就是必須字段,我們需要知道在我們填寫信息時,雖然有些數(shù)據(jù)不是必填的,但是這些信息是有格式要求的,比如手機號碼或者網(wǎng)址等等,這樣的信息不能夠隨便填寫。這時候我們要怎樣才能完成對這種信息的驗證呢?
這時候我們就要通過正則表達式來進行對表單中的右鍵和URL信息進行驗證了。如果對正則表達式不太清楚的話可以點擊《正則表達式視頻教程》進行學習。下面就簡單的給大家介紹一下我們在驗證表單數(shù)據(jù)時會用到的正則表達式的一些知識。
正則表達式
正則表達式是一種描述一段文本規(guī)則的方法,它不是精確的匹配,而是通過一些特定的符號來模糊匹配。在PHP中,我們使用preg_match
函數(shù)來執(zhí)行正則表達式的匹配,一個參數(shù)是我們的正則表達式規(guī)則,第二個參數(shù)是需要檢查的文本。
preg_match
函數(shù)的語法格式如下:
preg_match ( string $正則 , string $字符串 [, array &$結(jié)果] )
其中我們需要注意到的是:根據(jù)$正則變量
,匹配$字符串變量
。如果存在則返回匹配的個數(shù),把匹配到的結(jié)果放到$結(jié)果變量
里。如果沒有匹配到結(jié)果返回0。^
表示開始;$
表示結(jié)束。
接下來我們通過示例來看一下正則表達式的應用:
<?php header("Content-type:text/html;charset=utf-8"); //設置編碼 $str = 'date20150121'; if (preg_match('/^date/', $str)) { echo '匹配成功'; } else { echo '匹配失敗'; } ?>
以上示例中就是在匹配以date 開始的編號。輸出結(jié)果:
接下來我們看一下preg_matchede
第三個參數(shù)是匹配的內(nèi)容,通常我們會將一個空的數(shù)組傳遞進去,因為是傳址調(diào)用,匹配結(jié)束后,數(shù)組中會得到具體匹配的內(nèi)容。
我們還是通過一個示例來看一下,示例如下:
<?php header("Content-type:text/html;charset=utf-8"); //設置編碼 $str = 'date20150121'; if (preg_match('/^date/', $str,$mat)) { print_r($mat); } else { echo '匹配失敗'; } ?>
輸出結(jié)果:
在正則表達式中字母使用w
、而數(shù)字使用d
(D
表示非數(shù)字)來表示
+
表示一個或者多個,*
表示0個或者多個,?
表示有或者沒有,{n}
表示具體幾位,{m, n}
表示大于m個,小于n個。
示例如下:
<?php header("Content-type:text/html;charset=utf-8"); //設置編碼 $name = "zhang"; // wang zhu hu ma tan if (preg_match('/an|hu/', $name, $arr)) { print_r($arr); } else { echo '匹配失敗'; } ?>
輸出結(jié)果:
使用或條件可以用來匹配字符串,如果僅僅是單個的字母或者字符,則可以使用范圍表示,使用[]
可以表示一個字符的取值范圍'/[a0.]/'
可以匹配包含了a或者0或者.
的任意字符串。
另外,正則表達式還可以使用-來表示一組范圍,[a-z]
表示小寫的26個字母中的任意一個,[A-Z]
表示一個大寫字母,[0-9]
表示一位十進制數(shù)。
正則表達式了解這么多,接下來我們就要來驗證表單的格式是否正確了。
PHP驗證名稱、郵件和URL
名字的驗證規(guī)則是必須的,并且只能包含字母和空格。E-mail的驗證規(guī)則是必須的,其中必須是一個有效的電子郵件地址(包含'@'和'.')。網(wǎng)址的驗證規(guī)則的是可選的,并且如果存在,它必須包含一個有效的URL。備注的驗證規(guī)則是可選的,多行輸入字段。性別的驗證規(guī)則是必須的,必須選擇一個。
那接下來我們可以通過上述中的政策表達式來寫出以下代碼,將通過簡單的方式來檢測 name 字段是否包含字母和空格,如果 name 字段值不合法,將輸出錯誤信息,示例如下:
$name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z]*$/",$name)) { $nameErr = "只允許字母和空格"; }
通過上述代碼便能夠提示用戶姓名填寫的格式,接下來我們可以根據(jù)同樣的方法來驗證郵件和URL。
郵箱名可以是字母、數(shù)字、下劃線和點組成的任意字符;郵箱要包含@符號,后面的文字按域名規(guī)則處理,以下代碼將通過簡單的方式來檢測 e-mail 地址是否合法。如果 e-mail 地址不合法,將輸出錯誤信息,示例如下:
$email = test_input($_POST["email"]); if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) { $emailErr = "無效的 email 格式!"; }
以下代碼將檢測URL地址是否合法 (以下正則表達式運行URL中含有破折號:"-
"), 如果 URL 地址不合法,將輸出錯誤信息,示例如下:
$website = test_input($_POST["website"]); if (!preg_match("/b(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/% =~_|]/i",$website)) { $websiteErr = "無效的 URL"; }
將上述的驗證方法添加到整體的格式中,示例如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文網(wǎng)</title> </head> <style> .error {color: #FF0000;} </style> <body> <?php // 定義變量并設置為空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "姓名是必填的"; } else { $name = test_input($_POST["name"]); // 檢查姓名是否包含字母和空白字符 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允許字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "電郵是必填的"; } else { $email = test_input($_POST["email"]); // 檢查電子郵件地址語法是否有效 if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) { $emailErr = "無效的 email 格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 檢查 URL 地址語法是否有效(正則表達式也允許 URL 中的斜杠) if (!preg_match("/b(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) { $websiteErr = "無效的 URL"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性別是必選的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 驗證實例</h2> <p><span class="error">* 必需的字段</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 姓名:<input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> <br><br> 郵箱:<input type="text" name="email"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 網(wǎng)址:<input type="text" name="website"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 評論:<textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性別: <input type="radio" name="gender" value="female">女性 <input type="radio" name="gender" value="male">男性 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="提交"> </form> <?php echo "<h2>您的輸入:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
通過上述代碼,當我們沒有按照我們設置的規(guī)則填寫的話,輸出結(jié)果如下:
當然作為擴展知識,也可以使用彈窗,只需要在上述示例中的代碼做些改動,將輸出的字符變成彈窗的格式,示例如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PHP中文網(wǎng)</title> </head> <style> .error {color: #FF0000;} </style> <body> <?php // 定義變量并設置為空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "<script language="javascript"> { alert("姓名是必填的"); //彈出對話框 } </script>"; } else { $name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "<script language="javascript"> { alert("姓名只允許字母和空格"); //彈出對話框 } </script>"; } } if (empty($_POST["email"])) { $emailErr = "<script language="javascript"> { alert("電郵是必填的"); //彈出對話框 } </script>"; } else { $email = test_input($_POST["email"]); // 檢查電子郵件地址語法是否有效 if (!preg_match("/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/",$email)) { $emailErr = "<script language="javascript"> { alert("無效email的格式"); //彈出對話框 } </script>"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 檢查 URL 地址語法是否有效(正則表達式也允許 URL 中的斜杠) if (!preg_match("/b(?:(?:https?|ftp)://|www.)[-a-z0-9+&@#/%?=~_|!:,.;]*[-a-z0-9+&@#/%=~_|]/i",$website)) { $websiteErr = "<script language="javascript"> { alert("無效的URL"); //彈出對話框 } </script>"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "<script language="javascript"> { alert("性別是必選的"); //彈出對話框 } </script>"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 驗證實例</h2> <p><span class="error">* 必需的字段</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 姓名:<input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> <br><br> 郵箱:<input type="text" name="email"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 網(wǎng)址:<input type="text" name="website"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 評論:<textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性別: <input type="radio" name="gender" value="female">女性 <input type="radio" name="gender" value="male">男性 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="提交"> </form> <?php echo "<h2>您的輸入:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
當填寫內(nèi)容不按規(guī)定規(guī)則是,點擊提交,輸出結(jié)果如下:
如此我們便完成了PHP驗證名稱、郵件和URL。
大家如果感興趣的話,可以點擊《PHP視頻教程》進行