2013-05-20 26 views
2

這是在phpbb中驗證電子郵件地址的函數的一部分。 我有一個有效的電子郵件地址電子郵件地址的正則表達式在'dot'之前不接受'&'

「pwd-p & r2.coop @ ...」但它不被驗證接受。

有趣的是,當我嘗試 「pwd-pr2.co & OP @ ......」(與 '&' '點' 後)

和「PWD-PR & 2coop @ ... 「(沒有'圓點'),兩者都是有效的,

但是」pwd-pr & 2.coop @ ...「('&'之後的'點')不是。

我試圖改變幾天的正則表達式,但仍然不知道如何解決它,以便它接受我的電子郵件地址。

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 
+0

'&'不是正則表達式中的特殊字符,所以你不需要轉義它 – Stephan

+0

我無法確認,對我來說它也匹配'pwd-p&r2.coop @ ...'。你使用什麼正則表達式引擎(什麼編程語言)?除了正則表達式之外,是否還有額外的驗證接受約束? – Bergi

+0

@ted:否。在那裏提出的正則表達式顯然不符合OP的有效地址。相反,看看http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/ – Bergi

回答

1

試試這個:

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)+$'; 
     return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 

我轉義是沒有必要的領先括號表達式逃脫字符。這似乎已經成功了。更具體地說,我遺漏的唯一字符是:(a)',由於PHP字符串轉義語法,和(b)/,因爲我使用/作爲PHP的preg分隔符。

不幸的是,我沒有關於爲什麼這個無法解決問題的理論。然而,只有逃避需要轉義的東西纔是最佳做法,所以我根據「應該」做了什麼來解決問題,所以我很樂意分享。答案並不令人滿意,但至少似乎有效。

下面是我用於測試的測試工具,如果它是非常有用的,再加上matchiness:

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)+$'; 
     return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 

var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-p&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'hello')); // Does not match 
var_dump(preg_match('/' . get_preg_expression('email') . '/', '[email protected]')); // Does not match 
var_dump(preg_match('/' . get_preg_expression('email') . '/', '[email protected]')); // Matches 
+1

我幾分鐘前沒有看到您的答案。我剛剛測試過你的正則表達式。它工作得很好。謝謝! – Anh

+0

很高興幫助! – sigpwned

3

電子郵件不應該使用正則表達式進行驗證,正是出於這個在這個問題發生的原因 - 這是複雜,而且事實上沒有人能夠正確。

PHP有一個內置的電子郵件驗證程序,其格式爲filter_var()函數。這通常是驗證電子郵件的最佳選擇。

這是一行代碼,沒有任何複雜的正則表達式。

例從上面的鏈接(即,PHP手冊)複製:

<?php 
$email_a = '[email protected]'; 
$email_b = 'bogus'; 

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) { 
    echo "This (email_a) email address is considered valid."; 
} 
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) { 
    echo "This (email_b) email address is considered valid."; 
} 
?> 

希望有所幫助。

+0

對於PHP來說,這絕對是正確的事情(所以+1),但是它會在OP對phpBB的需求的背景下工作嗎? AFAIK,phpBB處理大量的正則表達式驗證,所以在這種情況下,正確的答案可能實際上不起作用。 OP,你可以確認這是適合你的需求嗎? – sigpwned

+0

@Spudley:的確,filter_var()的效果很好。我曾經這樣做過。但是,我使用phpBB的代碼,因此很難修復已經構建的所有內容。但是謝謝你! – Anh

+0

@sigpwned:你完全正確。我仍然嘗試使用不同的正則表達式來解決這個問題。 – Anh

相關問題