2011-09-22 57 views
0

我在PHP中創建了一個表單,其中包含一個稱爲電子郵件的字段,用戶需要輸入他/她的電子郵件ID。爲了確保輸入的郵件ID在語法方面是真實的(例如,[email protected]有效),我需要對其添加某種驗證。我發現情況很模糊,因爲我不明白如何檢查輸入的郵件ID是否包含@符號等。請幫忙。謝謝。 :)使用PHP在表單中驗證電子郵件輸入

+2

可能的重複http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses。 –

回答

8

最好的辦法是隻做:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    ... 
} 

,讓PHP處理繁重的工作適合你。否則,如果你想成爲完全正確,直接使用正則表達式你自己,你會堅持這個畸形:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

嚴格遵守RFC2822。

+0

是的,這是要走的路!如果電子郵件缺少頂級域名(本地主機有效),那麼您可以另外使用'preg_match('/ \。[AZ] {2,4} $/i')檢查2-4個字符的域名, $電子郵件)'。 – martinstoeckli

1

您可以使用正則表達式來驗證格式:

<?php 

$email = "[email protected]"; // or perhaps $_POST['email']; 

if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 

    echo "Valid email address."; 
} 
else { 
    echo "Invalid email address."; 
} 

?> 

http://php.net/manual/en/function.eregi.php

+0

也是一個非常沉悶的電子郵件正則表達式,失敗了許多有效的地址。不要複製和粘貼這個。 – mario

0

從我自己的代碼:

if(!preg_match("(^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$)i", $email)) 
    echo "E-mail address invalid"; 

極少數的合法地址的可能失敗,例如任何@example.info,以及任何使用不尋常字符的電子郵件地址,但大多數情況下,這很好地工作。

+0

可怕的正則表達式。它甚至會在'+'加上地址符號時失敗。請不要進一步分發。 – mario

+0

我從來沒有在他們的電子郵件地址中看到任何帶有「+」號的人。 –

+0

每個Gmail用戶都可以使用它們。非常可能的垃圾郵件過濾工具。而且每當一個網站不接受它時,它就會告訴你。雖然大多無能。這也就是爲什麼'-1' – mario

2

首先您需要定義有效的電子郵件地址

有不同的方法來取決於這個驗證對你有多重要。

有些人使用crazy by-the-RFC regexps.

另一個極端,就是保存任何用戶輸入,後來嘗試發送確認郵件到該地址。沒有確認=錯誤的電子郵件。

你可能想的東西之間:確保有一個在中間的@,例如:

$email_arr = explode('@', $email); 
if (sizeof($email_arr) !== 2 || $email_arr[0] == '' || $email_arr[1] == '') 
    ... // definitely not valid 

UPD:馬克·B帶filter_var($email, FILTER_VALIDATE_EMAIL) 這可能是最好的方式把它釘。