2011-03-09 167 views
2

我的應用程序中存在一個錯誤,顯然是在一個電子郵件地址的本地部分的末尾出現點而不被認爲是錯誤,我使用的web服務告訴我該電子郵件地址格式不正確。如果sfValidatorEmail不接受電子郵件地址本地部分末尾的點?

sfValidatorEmail使用正則表達式:

const REGEX_EMAIL = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i'; 

點在一個電子郵件地址的本地部分的結尾顯然是有效的根據symfony的1.4

是否有任何有效的理由sfValidatorEmail不在電子郵件地址的本地部分接受點?

問題來自我使用的web服務嗎?

UPDATE

剛纔看了RFC 3696和這裏就是這樣說的:

沒有引號,本地部分可以由字母 字符,數字任意組合 ,或任何 特殊字符

! # $ % & ' * + -/= ?^_ ` . { | } ~ 

期間(「。」)也可能出現,但 可能不會用於開始或結束
本地部分
,也不會出現兩個或更多個連續期間。

+0

看來你發現了一個bug ...也許你可以報告它... – greg0ire 2011-03-12 11:33:02

回答

1

有趣的是,最初的Symfony 1.0版本有一個更可擴展的電子郵件驗證器。你可以閱讀http://trac.symfony-project.org/browser/branches/1.0/lib/validator/sfEmailValidator.class.php?rev=6991

有兩種選擇,內置的正則表達式模式,上面提到的那個,然後是Cal Henderson的。我相信Cal可能更適合您的需求,您可以使用Symfony的Regex Validator輕鬆使用它。我粘貼了正則表達式模式和下面的解釋註釋。

/* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/ 
* The long regular expression below is made by the following code 
* fragment: 
* 
* $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'; 
* $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'; 
* $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c' 
*   . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'; 
* $quoted_pair = '\\x5c\\x00-\\x7f'; 
* $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d"; 
* $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22"; 
* $domain_ref = $atom; 
* $sub_domain = "($domain_ref|$domain_literal)"; 
* $word = "($atom|$quoted_string)"; 
* $domain = "$sub_domain(\\x2e$sub_domain)*"; 
* $local_part = "$word(\\x2e$word)*"; 
* $addr_spec = "$local_part\\x40$domain"; 
*/ 

$re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-' 
    .'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-' 
    .'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' 
    .'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80' 
    .'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29' 
    .'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^' 
    .'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-' 
    .'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-' 
    .'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*' 
    .'\\x5d))*$/' 
; 

我想這也是導入記住,在極少數情況是一個電子郵件地址可能不符合RFC,如本地Intranet的電子郵件地址。只是一個想法。

+2

我相信你可能真的想看看這個URL,因爲Cal從此更新了他的PHP電子郵件驗證器。 http://code.iamcal.com/php/rfc822/ – macguru2000 2011-03-26 23:27:15

相關問題