2011-04-30 2 views
1

의 유효성을 검사하는 방법을 구축 :어떻게 그렇게 같은 방법을 만들 싶습니다 이메일을

def email_is_junk(email_address) 
end 

가 true를 돌려주는 경우 정크 메일, 거짓 이메일이 정크가 아닌 경우 ... 까다로운 부분 나는 논리는 다음과 같은 조건을 기반으로하는 것을 원하는 것입니다 : 이메일은 사용자의 +가있는 경우

[email protected]

  • 를 이메일을 정크
  • 사용자 contai 경우입니다 NS 단어가 할-하지 회신 또는 지원, 테스트, 서비스, 팁, 트위터, 경고, 설문 조사, 이메일 정크
  • 도메인이 craigslist.org 인 경우이며, 이메일은 방법에 정크

제안입니다 이 방법은 승/필요하면 수십개의 블록을 정규식으로 작성 하시겠습니까?

USER_RULES = ['\+', 'do-not-reply', 'support', 'test', 'service', 'tips', 'twitter', 'alerts', 'survey'] 
DOMAIN_RULES = ['craigslist.org'] 

def email_is_junk(email) 
    return true if !email.match('@') # return early if no @ 
    user, domain = email.split('@') 
    USER_RULES.each { |rule| return true if user.match(rule) } 
    DOMAIN_RULES.each { |rule| return true if domain.match(rule) } 
    false # reached the end without matching anything 
end 
+0

수십 개의 블록을 쓸 필요가 없습니다. 배열에 수십 개의 정규식을 반복 할 수 있습니다. 또는 더 나은 (?) 유지 보수성을 위해 YAML/plaintext 파일에서 찾을 정규식과 가능한 모든 문자열을 작성하고로드하십시오. (매우 자주 *를 자주 수행 할 경우 해당 항목을 피하는 것이 좋습니다. 파일로드의 오버 헤드 - 벤치마킹 및 불필요하게 최적화하지 않음). – Zabba

+0

감사합니다. 수표는 매우 유용 할 것입니다. 수표를 작성하기 위해 반복 처리하는 방법의 예를 보여줄 수 있습니까? 일치가 발견되면 효율적으로 깨지기를 바랍니다. – AnApprentice

답변

2

. 이 100 % 정확하지 그래서,

function isJunk(email) { 
    return hasPlus(email) || supportLike(email) || craigsList(email); 
} 

function craigsList(email) { 
    return email.match(/@craigslist\.org/); 
} 

function supportLike(email) { 
    return email.match(/do-not-reply|support|test|service|tips|twitter|alerts|survey/); 
} 

function hasPlus(email) { 
    return email.match(/\+.*@/); 
} 

이는 휴리스틱이다 : 그것보다 훨씬 간단 할 수 있습니다 확실하지. 여전히 문제가있는 경우 사용자에게 토큰이 포함 된 이메일을 보내 확인을 고려하십시오.

+1

아마도 "junk_email_address?" 또한'email.split ('0')'은 무엇입니까? – Zabba

+0

감사합니다. 그러나 확실하지 않습니다. 여기서 무슨 일이 일어나고 있는지 잘 모릅니다. 돌아 오는 것이 끝나야합니까? – AnApprentice

+0

또한 다음과 같은 오류가 있습니다. 동적 상수 할당 USER_RULES = [ '+', 'do-not-reply', 'suppor ... – AnApprentice

0

가 여기에 자바 스크립트 버전입니다 : 위의 Zabba의 의견에 그림으로

+0

"사용자에게 토큰이 포함 된 전자 메일을 보내 검증을 고려하십시오." 확실히 알 수있는 유일한 방법입니다. 복잡한 정규 표현식의 경우에도 이메일 주소가 너무 복잡합니다. –

1

Ruby의 Regexp.unionRegexp.escape 메소드를 살펴보십시오. 텍스트 또는 정규식 문자열을 기반으로 정규식 패턴을 쉽게 생성 할 수 있습니다.

union 문서에서입니다 :

는 반환 주어진 패턴의 조합 인 정규 표현식 객체, 즉, 기타 부품을 일치합니다. 패턴은 Regexp 객체 일 수 있습니다.이 경우 해당 옵션은 보존되거나 문자열입니다. 패턴을 지정하지 않으면/(?!) /를 반환합니다. 주어진 패턴에 캡처가 포함되어 있으면 동작이 지정되지 않습니다.
Regexp.union       #=> /(?!)/ 
Regexp.union("penzance")    #=> /penzance/ 
Regexp.union("a+b*c")    #=> /a\+b\*c/ 
Regexp.union("skiing", "sledding") #=> /skiing|sledding/ 
Regexp.union(["skiing", "sledding"]) #=> /skiing|sledding/ 
Regexp.union(/dogs/, /cats/i)  #=> /(?-mix:dogs)|(?i-mx:cats)/ 

그리고 escape 문서에서

:

탈출 정규 표현식에서 특별한 의미를 갖는 것 모든 문자. 새로운 이스케이프 된 문자열을 반환하거나 문자가 이스케이프되지 않으면 self를 반환합니다. 모든 문자열에 대해 Regexp.new (Regexp.escape (str)) = ~ str이 true가됩니다.

patterns = [ 
    /.+?\[email protected]/ 
] 

strings = [ 
    'do-not-reply', 'support', 'test', 'service', 'tips', 'twitter', 'alerts', 'survey', 
    'craigslist.org' 
] 

regex = Regexp.union(
    *patterns, 
    *strings.map{ |s| 
    Regexp.new(Regexp.escape("#{ s }@"), Regexp::IGNORECASE) } 
) 
pp regex 

>> /(?-mix:.+?\[email protected])|(?i-mx:do\-not\[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx:[email protected])|(?i-mx 

상기 적용 :

sample_email_addresses = %w[ 
    user 
    user+foo 
    do-not-reply 
    support 
    service 
    tips 
    twitter 
    alerts 
    survey 
].map{ |e| e << '@host.com' } 

pp sample_email_addresses.map{ |e| [e, !!e[regex]] } 

>> [["[email protected]", false], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true], 
>> ["[email protected]", true]] 

출력은 각각의 테스트 주소를 포함한리스트를 나타낸다

Regexp.escape('\*?{}.') #=> \\\*\?\{\}\. 

시작점이다. true은 정규 표현식에서 히트가 발생했음을 의미합니다. 즉, 잘못된 것이 있었음을 의미하고, false은 깨끗하고 안전하다고 판단했음을 의미합니다.당신은 단지 즉, 전달 된 사람을 원하는 경우, 정규식 히트를 트리거하지 않았다

pp sample_email_addresses.select{ |e| e[regex] } 

>> ["[email protected]", 
>> "[email protected]", 
>> "[email protected]", 
>> "[email protected]", 
>> "[email protected]", 
>> "[email protected]", 
>> "[email protected]", 
>> "[email protected]"] 

:

에만 즉, 실패하는 사람을 원하는 경우, 정규식 일치

pp sample_email_addresses.reject{ |e| e[regex] } 

>> ["[email protected]"] 
+0

고마워요, 이것은 매우 유익한 정보이지만 true 또는 false를 반환하는 메서드를 만드는 데 어떻게 이것을 사용합니까? 감사합니다 틴 맨 – AnApprentice

+0

예제를 추가하겠습니다. –

관련 문제