[javascript] JavaScript에서 이메일 주소를 확인하는 방법

JavaScript에서 이메일 주소를 확인하는 정규식이 있습니까?



답변

정규식을 사용 하는 것이 가장 좋습니다. 여기 에서 많은 테스트를 볼 수 있습니다 ( 크롬 에서 가져온 )

function validateEmail(email) {
    const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

유니 코드를 허용하는 정규 표현식의 예는 다음과 같습니다.

const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

그러나 JavaScript 유효성 검사에만 의존해서는 안됩니다. JavaScript는 쉽게 비활성화 할 수 있습니다. 이것은 서버 측에서도 검증되어야합니다.

위의 예제는 다음과 같습니다.

function validateEmail(email) {
  const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  const $result = $("#result");
  const email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>


답변

나는 다음 과 같은 형태로 간단한 검증을 원하는 사람들을 위해 Jaymon의 답변 을 약간 수정 했습니다 .

anystring@anystring.anystring

정규식 :

/\S+@\S+\.\S+/

JavaScript 함수 예 :

function validateEmail(email) 
    {
        var re = /\S+@\S+\.\S+/;
        return re.test(email);
    }
    
console.log(validateEmail('anystring@anystring.anystring'));


답변

완전성을 위해 여기에 다른 RFC 2822 호환 정규식이 있습니다.

공식 표준은 RFC 2822 로 알려져 있습니다 . 유효한 이메일 주소를 준수해야하는 구문을 설명합니다. 당신은 할 수 있습니다 ( 하지만 당신은 안읽어 이 정규 표현식으로 구현)

(?:[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])+)\])

(…) 큰 따옴표와 대괄호를 사용하여 구문을 생략하면 RFC 2822를보다 실용적으로 구현할 수 있습니다. 현재 실제 사용중인 모든 이메일 주소의 99.99 %와 일치합니다.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

추가로 변경할 수있는 것은 2 문자 국가 코드 최상위 도메인과 특정 일반 최상위 도메인 만 허용하는 것입니다. 이 정규식은과 같은 더미 이메일 주소를 필터링합니다asdf@adsf.adsf . 당신은 새로운 최상위 도메인이 추가로 업데이트해야합니다 .

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

따라서 공식 표준을 준수하더라도 여전히 타협점이 있습니다. 온라인 라이브러리 나 토론 포럼에서 정규 표현식을 맹목적으로 복사하지 마십시오. 항상 자신의 데이터와 자신의 응용 프로그램에서 테스트하십시오.

강조 광산


답변

와우, 여기에는 많은 복잡성이 있습니다. 가장 명확한 구문 오류를 잡기 만하면 다음과 같이 할 수 있습니다.

^\S+@\S+$

일반적으로 사용자가 만드는 가장 명백한 오류를 포착하고 양식이 대부분 올바른지 확인합니다. 이것이 JavaScript 유효성 검사의 모든 것입니다.


답변

이메일을 확인하기 위해 정규식을 사용하기로 결정한 순간을 이해해야 할 것이 있습니다. 아마 좋은 생각이 아닙니다 . 일단 당신이 그 용어를 알게되면, 거기에 반쯤 갈 수있는 많은 구현 있습니다. 이 기사는 그것들을 훌륭하게 요약합니다.

간단히 말해서, 절대적으로, 사용자가 입력 한 것이 실제로 이메일이 실제로 이메일을 전송하고 어떤 일이 일어나는지 보는 것임을 확실하게 확신 할 수있는 유일한 방법입니다. 그 외에는 모두 추측 일뿐입니다.


답변

HTML5 자체에는 이메일 유효성 검사가 있습니다. 브라우저가 HTML5를 지원하는 경우 다음 코드를 사용할 수 있습니다.

<form><input type="email" placeholder="me@example.com" required>
    <input type="submit">
</form>

jsFiddle 링크

로부터 HTML5 사양 :

유효한 전자 메일 주소가 일치하는 문자열입니다 email다음 ABNF의 생산을위한 문자 세트는 유니 코드입니다.

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

이 요구 사항은 RFC 5322를 고의적으로 위반 하는 것으로, 동시에 너무 엄격하고 ( “@”문자 앞), 모호한 ( “@”문자 뒤), 너무 느슨한 (주석 허용) 전자 메일 주소의 구문을 정의합니다. , 공백 문자 및 대부분의 사용자에게 친숙하지 않은 방식으로 따옴표로 묶은 문자열)을 여기에서 실제로 사용할 수 있습니다.

다음 JavaScript 및 Perl 호환 정규식은 위 정의를 구현 한 것입니다.

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

답변

이것이 최선의 해결책이라는 것을 알았습니다.

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

다음 형식을 허용합니다.

1. prettyandsimple@example.com
2. very.common@example.com
3. disposable.style.email.with+symbol@example.com
4. other.email-with-dash@example.com
9. #!$%&'*+-/=?^_`{}|~@example.org
6. "() [] :,; @ \\\"! # $ % & '* +-/ =? ^ _`{} | ~ .a "@ example.org
7. ""@ example.org (따옴표 사이의 공백)
8. üñîçøðé@example.com (로컬 부분의 유니 코드 문자)
9. üñîçøðé@üñîçøðé.com (도메인 부분의 유니 코드 문자)
10. Pelé@example.com (라틴)
11. δοκιμή@παράδειγμα.δοκιμή (그리스어)
12. 我 買 @ 屋企. 香港 (중국어)
13. 甲 斐 @ 黒 川. 日本 (일본어)
14. чебурашка@ящик-с-апельсинами.рф (키릴 자모)

그것은 분명히 다재다능하고 가장 중요한 국제 캐릭터를 허용하면서도 기본적인 everything@anything.anything 형식을 시행합니다. RFC에서 기술적으로 허용되는 공간을 차단하지만 너무 드물기 때문에이 작업을 수행 할 수 있습니다.