2013-06-09 2 views
0
나는 레일 응용 프로그램의 이메일 DB에 이메일을 검증하기 위해 다음과 같은 정규식을 사용하고

으로 "두 배 점"을 제거루비 : 정규식

/\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

이 좀 작동하지만, 잘못된 메일로 날 나뭇잎 이십 기가 바이트

[email protected] 

가 어떻게이 정규식을 rwrite 수 또는 느릅 나무는 난 단지 유효한 이메일 주소를 떠날 필요가 이메일 목록을 정리하는 가장 좋은 정규식입니다을 피하기 위해 : 오류의 종류가? 나는 목록을 정리하기 위해 이와 같은 방법을 사용하고 있습니다 :

def mailSweep 
    mails = Email.all.lazy 
    for address in mails do 
    if address.email.to_s =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
     puts address.email.to_s + " " + "it's valid" 
    else 
     puts address.email.to_s + " " + "it's invalid, destroying..." 
     address.destroy 
    end 
    end 
end 
+3

정규식 유효성 검사 이메일 주소의 슬픈 현실을 보려면 http://stackoverflow.com/questions/703060/valid-email-address-regular-expression을 참조하십시오. 그런 다음 당신을 위해 그것을 할 수있는 보석을 찾으십시오. 여기에 하나 : https://github.com/dim/rfc-822. –

+0

@ 짐 스튜어트 (Jim Stewart), 결함이있는 이유와 훌륭한 대체 솔루션을 보여주는 +1. –

답변

1

나는이 정규식은 모든 법적 이메일 주소를 허용하지 않습니다

/\A[^@\s][email protected]([-a-zA-Z0-9]{1,63}\.)+[a-zA-Z0-9]{2,63}\z/ 

참고하시기 바랍니다. 모든 RFC 822 유효한 전자 메일 주소가 주석을 제거 할 수 있도록하려면 insanely complicated이 필요합니다. 주석을 포함 시키려면 정규 표현식의 기능을 넘어서고 lexical parser으로 가야합니다.

그렇다면 이메일이 실제로 유효한 것인지 확신 할 수 없습니다. 가장 좋은 검사는 수신 시스템이 수신 할 수 있는지 확인하는 것입니다. 물론 그때조차도 자동으로 폐기 될 수 있습니다 ....

+0

실제로 작동하는 유일한 테스트는 전자 메일을 보내 사용자가 응답을 받았는지 확인하는 것입니다. –