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


4372

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



60
너무 많은 웹 사이트가 "firstName@secondName.name"의 이메일 주소를 좋아하지 않습니다. 모든 최상위 도메인이 2 ~ 3 자로 끝나지는 않습니다.
Ian Ringrose

41
전자 메일에 대한 정규식 검사 사용에 대한 모든 지원은 100 %입니다. "foo+bar@gmail.com"의 이메일 주소가 유효하지 않다는 말에 지쳤습니다. 가장 좋은 방법은 사용자에게 전자 메일을 두 번 입력하도록 요청하고 정규식 검사기를 사용해야하는 경우 전자 메일 주소가 유효하지 않은 것으로 사용자에게 알리고 입력했는지 확실하게 묻습니다. 권리. 정규 표현식 검사에서 체크 아웃하지 않은 것을 지적하기 위해 양식 제출을 중지하지 마십시오.
Soundfx4

17
@ Soundfx4 : 이것은 대답이어야하며 그렇게 받아 들여야합니다. 주소의 정확성을 테스트하는 것은 멍청한 일 입니다. 고객을 좌절시키는 가장 좋은 방법입니다. 나는 (누락 주소가있는 몇 가지 문제가 있음을 두 번 입력하고 힌트 될 요청 @, ;com등), 그들이 원하는 경우 수정을 사용자가 할 (그리고 그들이 나를 보내 어떤 동의)
WoJ

4
WoJ의 답변에 전적으로 동의합니다. 유효한 전자 우편 주소의 형식은 단순한 정규식으로 확인하기에는 너무 복잡합니다. 주소가 유효한지 확인하는 유일한 방법은 시도해 보는 것입니다.
니콜

답변:


4941

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

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>


574
이 정규식은 유효한 사용중인 전자 메일을 제거합니다. 사용하지 마세요. "RFC822"또는 "RFC2822"에 대한 Google은 적절한 정규식을 얻습니다.
Randal Schwartz

42
이것은 RFC 822의 예도 받아들이지 않습니다. 일부 간단한 경우 a \ @ b @ c.com, a(b)@c.com과 일치하지 않습니다. 자세한 내용은 RFC를 참조하십시오. 유효한 주소 [^ @] + @ [^ @] + \. [^ @] +를 거부하지 않고 일반적인 오류로부터 보호하는 정규식이 있습니다.
Vroo

126
@GoodPerson 방금 n @ ai에게 멋진 이메일 주소를 알려주기 위해 이메일을 보내려고했습니다. 그러나 아아, gmail은 나를 못하게합니다. 나는 그것이 내 사이트의 자바 스크립트 유효성 검사보다 이메일을 통해 다른 사람들과 통신하는 데 더 큰 문제가있는 사람을 의심합니다! 그러나 도전에 감사드립니다.
벤 로버츠

26
이 방법은 대부분의 영어 원어민에게는 잘 보이지만 터키 테스트에 실패합니다 (Joel Spolsky 참조). 대부분의 유니 코드 문자가 허용되며 아르헨티나와 같이 "ñoñó1234@server.com"과 같은 주소는 완벽하게 정상입니다. joelonsoftware.com/articles/Unicode.html
oligofren

139
이메일 주소, 기간을 확인할 수 없습니다. 이메일 주소를 확인할 수있는 유일한 사람은 이메일 주소 제공 업체입니다. 예를 들어이 답변에는 다음 이메일 주소 %2@gmail.com, "%2"@gmail.com, "a..b"@gmail.com, "a_b"@gmail.com, _@gmail.com, 1@gmail.com , 1_example@something.gmail.com가 모두 유효하지만 Gmail에서는 이러한 이메일 주소를 허용하지 않습니다. 전자 메일 주소를 수락하고 해당 전자 메일 주소로 전자 메일 메시지를 보내면 사용자가 유효성을 확인하기 위해 방문해야하는 코드 / 링크와 함께이 작업을 수행해야합니다.
Kevin Fegan

829

나는 다음 과 같은 형태로 간단한 검증을 원하는 사람들을 위해 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'));


69
몇 명의 사용자에게 문제를 일으킬 수 있고 앞으로는 유효하지 않을 수있는 20 배의 무언가를 구현할 수 있거나 ImmortalFirefly의 버전을 가져 와서 최소한 실제처럼 보이도록 노력할 수 있습니다. 응용 프로그램에 따라 실제로 존재하지 않는 전자 메일 주소를 입력하여 문제를 일으키는 사람이 아닌 기존의 전자 메일을 수락하지 않기 때문에 누군가를 만나게 될 가능성이 더 높습니다 (어쨌든 입력하여 수행 할 수 있음) 100 % 유효한 RFC2822 이메일 주소이지만 등록되지 않은 사용자 이름 또는 도메인을 사용하는 경우) 공감!
user83358

82
@ImmortalFirefly, 제공 한 정규식이 실제로 일치 name@again@example.com합니다. 라인을 JavaScript 콘솔에 붙여 넣습니다. 나는 당신의 의도가 텍스트 '^'의 시작과 텍스트 '$'연산자가 필요한 전체 텍스트 만 일치한다고 생각합니다. 내가 사용하고있는 것은/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('name@again@example.com')
OregonTrail

8
이 검증에 근거하여이 이메일은 유효합니다 : check @ this..com
Ehsan

4
흠. Wikipedia"very.unusual.@.unusual.com"@example.com유효한 이메일 주소 라고 말합니다 . /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test('"very.unusual.@.unusual.com"@example.com') // false. 죄송합니다.
베이컨 비트

3
이것도 허용되지 @@@.@않습니까? : D
hfossli

762

완전성을 위해 여기에 다른 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

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

강조 광산


84
NB : " 오늘 실제 사용 "은 코드를 작성할 때 200x로 다시 유효했을 수 있습니다. 이 코드 해당 연도 이후에도 계속 사용됩니다. (내가 고쳐야 할 "모든 meh에 대해 한푼도 없었다면, 내가 고쳐야 할 4 개 이상의 문자 TLD를 사용하지 않을 것입니다."라고 전 세계 구리 및 니켈 시장을
코너링

7
RFC 2822의 실제 구현을 위해서는 단일 문자 도메인 확장을 막기 위해 결말을 약간 수정해야합니다. / [a-z0-9! # $ % & '* + \ / =? ^ _ {|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_{|} ~-] +) * @ (? : [a-z0-9] (? : [a-z0-9 -] * [a-z0-9])? \.) + [a-z0-9] [a-z0-9-] * [a-z0-9] /
Farrell

5
또한 첫 번째 부분은 (? : [A는 대문자 A를 사용하여 사용자가 전자 메일 주소를 대문자로 입력 할 때 허위 부정을 피할 수 있음)이어야합니다.
Don Rolling

9
@DonRolling 그렇게하지 마십시오. "A ~ Z, a ~ z"를 의미하는 것이 아니라 "Z"와 "a" 사이에 있기 때문에 "[\] ^ _`"도 의미 합니다. \w어쨌든 컨벤션이므로 이메일 주소를 사용하기 전에 소문자를 사용하십시오 .
kirb

5
"새로운 최상위 도메인이 추가되면 업데이트해야합니다." 글쎄, 지금은 그렇게 많은 것입니다-1500 개가 넘는 TLD가 인정됩니다.
Nathan Osman

377

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

^\S+@\S+$

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


70
+1은 이메일을 보내고 어떤 일이 일어나는지 확인하는 것이 이메일 주소를 확인하는 유일한 확실한 방법이므로 간단한 정규식 일치 이상을 수행 할 필요가 없습니다.
kommradHomer

20
여전히 단순하게 유지할 수 있지만 "."가 있는지 확인하기 위해 조금 더 수행하십시오. @ 다음에 숫자 나 숫자 만 표시되므로 me @ here, me @ here @ 및 me @ herecom과 같은 것은 유효하지 않습니다 ... ^ \ S + @ \ S + [\.] [0-9a-z ] + $
Tim Franklin

14
전자 메일 주소에 공백이 포함될 수 있다고 생각합니다. 사용하는 것이 좋습니다.+@.+
Sam

11
/\S+@\S+/.test("áéíóúý@ÁÉÍÓÚÝð") true
gtournie

110
@gtournie 아무도 신경 쓰지 않습니다. 아무도 실수 로이를 이메일 필드 입력하지 않으며, 이는 모든 프론트 엔드 유효성 검사입니다. 사람들이 실수로 이름과 같은 잘못된 정보 (예 : 이메일 필드)를 입력하지 못하도록하기 위해.
meagar

330

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

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


112
-1 정규식 제어를 통과하지 못하는 전자 메일 주소를 확인하는 데 왜 시간을 보내고 싶습니까?
kommradHomer

63
@kommradHomer- "정규 유효하지 않은"주소는 거의 항상 유효합니다. 전자 메일 주소를 확인하는 데 사용하는 정규식은 거의 확실하지 않으며 유효한 전자 메일 주소를 제외하기 때문입니다. 이메일 주소는을 포함 하여 name_part@domain_part실제로 는 name_part에서 유효합니다. 주소 는로 이스케이프되어야하지만 합법적 입니다. 이메일이 'example.com'과 같은 도메인에 도달하면 해당 도메인은 메일을 "로컬로"라우팅 할 수 있으므로 "이상한"사용자 이름과 호스트 이름이 존재할 수 있습니다. @foo@bar@machine.subdomain.example.museumfoo\@bar@machine....
Stephen P

6
stackoverflow.com/a/1373724/69697 의 보이저 답변에서 두 번째 정규식은 사용하기에 실질적이며 거짓 부정이 거의 없어야합니다. @kommradHomer에 동의합니다. 왜 이메일을 보내지 않아도 되나요? 이해할 수없는 정규 표현식에 대한 반사적 인 싫어하는 것을 이해하고 코드를 간단하게 유지하려고하지만, 이것은 분명히 유효하지 않은 항목을 즉시 제거하여 서버에 많은 문제를 저장할 수있는 몇 줄의 코드입니다. 정규 표현식 자체는 도움이되지 않지만 서버 측 유효성 검사를 보완하는 역할을합니다.
벤 레젠 스판

6
@dmur 나는 "거의 항상 유효하다"는 것을 과장하고 있다고 생각하지만, .us도메인이 있거나 도메인 +의 왼쪽에 @- 많은 장소는이 지독한 오류를 수정했지만, (@ 왼쪽) 로컬 부분이 될 수 아무것도 도메인 소유자가 원하는. -> "foo@bar.com"@example.com <-은 유효한 이메일 주소입니다.
Stephen P

8
@kommradHomer "정규 유효하지 않은 주소는 유효하지 않은 주소 % 100입니다." 죄송합니다. 실례합니다 실제로 IT가 완전히 유효 할 때 foo+bar@gmail.com이 유효한 이메일이 아니라는 말을 몇 번이나 알고 있습니까?! 당신의 논리는 매우 결함이 있습니다. 이메일과 함께 양식을 제출했습니다 : thisisafakeemailbutit은 yourstupidregexcheck@regexchecksareretarded.com을 통과 할 것입니다. REGEX 검사를 통과하는 것은 ...하지만 유효한 전자 메일은 아닙니다 (기술적으로는 있지만 존재하지는 않지만 약속은하지만 아직 그의 턱을 긁습니다 ). 많은 사람들이 말했듯이, 그것은 나쁜 아이디어입니다 ....
Soundfx4

211

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])?)*$/

29
이것은 좋지만 이것의 문제점은 form태그 안에 있어야하며 submit입력 에 의해 제출 되어야한다는 것 입니다. 또한 오류 메시지의 스타일을 실제로 지정할 수 없습니다.
Jason

3
아래 양식을 작성하여 제출할 수있는 답변을 추가했습니다. 그러나 예, 브라우저는 일반적으로 전체 RFC 822 검증이 아닌 일부 타당성 검사 만 적용합니다.
Boldewyn

8
@ br1 :“a”최상위 도메인이 없기 때문에 유효하지 않습니다. 인트라넷이 일부 IP로 확인되면 어떻게됩니까?
날으는 양

7
HTML5 이메일 필드 유형은 user @ email과 같은 이메일을 허용합니다
Puce

1
참고 @Puce의 의견 : HTML 5 이메일 입력은 허용 user@email하지만 PHP 는 허용 filter_var하지 않습니다. 문제가 발생할 수 있습니다.
texelate

136

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

/^[^\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에서 기술적으로 허용되는 공간을 차단하지만 너무 드물기 때문에이 작업을 수행 할 수 있습니다.


9
이것은 내가하고있는 일입니다. 이러한 "복잡한"답변은 모두 문제를 일으 킵니다. 퓨니 코드 IDN을 허용하지 않거나 고정 된 TLD 세트를 사용하지 않거나 전자 메일 접두사 (@ 이전)에 [@ çµ.ö와 같은 문자를 사용하지 않도록 불필요하게 사용자를 제한합니다. 또는 도메인 이름. 백엔드의 JavaScript (원인의 백엔드 사용이 아님)는 보안상의 이유로 유효성 검증에 충분하지 않습니다. 따라서 사용자가 기본 오타를 방지하는 데 도움이되지 않는 이유는 무엇입니까? 기본 오타는 다음과 같습니다. TLD 또는 사용자 접두사 (@ 이전) 또는 도메인 부분 또는 유형을 잘못 입력 @합니다 .(또는 그 반대). 우리는 서버 측에서 더 제한적이어야합니다.
Hafenkranich

몇 가지 이상한 이유로이 username@domain.com패턴으로는 작동하지 않습니다
einstein

2
정규식에 따르면 "_.............. kamal@gmail.com"은 유효합니다.
Kamal Nayan

1
이 솔루션으로 땜질하고 싶다면 다음과 같이 명시된 RegEx를 참조하십시오. regex101.com/r/AzzGQU/2
ryanm

7
이 정규식이 맞습니다. 누군가가 자신의 이메일을 입력 a@b@c@d.x.y.@.z하면 나쁜 시간을 가질 자격이 있습니까? : D
corysimmons

94

최신 브라우저에서는 순수한 JavaScript와 DOM을 사용 하여 @Sushil의 답변 위에 구축 할 수 있습니다 .

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

바이올린 http://jsfiddle.net/boldewyn/2b6d5/에 예제를 작성했습니다 . Squirtle 's Answer의 기능 탐지 및 베어 본 유효성 검사와 결합 하여 정규 표현식 대학살을 피하고 오래된 브라우저에서 멈출 수 없습니다.


4
이것은 문제를 해결하기위한 영리한 아이디어이지만 브라우저가 엉뚱한 유효성 검사를 가지고 있기 때문에 작동하지 않습니다. 예를 들어 현재 버전의 Chrome, Firefox 및 Safari에서와 .@a같이 유효성이 검사됩니다 true.
행크

13
@HenryJackson 불행히도,이 경우에는 그렇습니다. 유효한 전자 메일 주소 인 RFC (인트라넷 생각)에 따라 있기 때문입니다. 브라우저의 유효성이 너무 좁아지고 잘못된 부정이 발생하면 브라우저가 구워집니다.
Boldewyn

3
기능 감지 및 정상적인 성능 저하를 포함하도록 업데이트되었으므로 이제 새 브라우저에서는 작동하지 않지만 원하는 정규식을 사용합니다.
Ronny

좋은 해결책. 슬프게도 이것은 HTML5 + 전용입니다.
Edward Olamisan

3
이것은 원래 질문에 대한 가장 좋은 해결책입니다. 예, HTML5를 사용하지만이 수준의 정확성을 요구하는 대부분의 응용 프로그램은 이미 다른 방법으로 HTML5에 의존하고 있으므로 문제가 될 수 있습니다. 어쨌든 누군가의 이메일을 확인하지 않고 이메일이 유효한지 여부를 판단하는 것은 불가능하므로, 실제로 이메일을 검증하는 데 많은 시간이나 노력을 투자해서는 안됩니다. 명백한 구문이나 장난 꾸러기를 확인하는 것은 우리가 노력해야 할 모든 노력입니다.
Woody Payne

69

이것은 올바른 RFC822 버전입니다.

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

IDN 주소는 확인되지 않습니다 (info@üpöü.com)
DAH

66

JavaScript는 정규식과 일치 할 수 있습니다.

emailAddress.match( / some_regex /);

이메일에 대한 RFC22 정규식 은 다음과 같습니다 .

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

1
@Kato : (?>역 추적을 중지 (?<angle><)…(?(angle)>)하고 긴 시간을 제공하지 않기 위해 호환되지 않는 확장을 사용합니다 |.
Ry-

60

모든 이메일 주소에는 'at'(예 : @) 기호가 있습니다. 필요한 조건을 테스트하십시오.

email.indexOf("@") > 0

더 복잡한 것을 귀찮게하지 마십시오. 전자 메일이 RFC 구문에 유효한지 완벽하게 확인할 수 있더라도 전자 메일을 제공 한 사람의 것인지 여부는 알 수 없습니다. 그것이 정말로 중요한 것입니다.

이를 테스트하려면 유효성 검사 메시지를 보내십시오.


3
하나 이상의 '@'기호가 있으면 어떻게합니까? 다른 제한된 기호? 이 검증은 신뢰할 수 없습니다 ...
eatmypants

56

RFC를 준수하는 전자 메일 주소의 올바른 유효성 검사는 한 줄짜리 정규식으로 얻을 수있는 것이 아닙니다. PHP에서 찾은 최고의 솔루션을 가진 기사 는 유효한 이메일 주소무엇입니까? . 분명히, 그것은 자바로 포팅되었습니다. JavaScript에서 이식 및 사용하기에는 함수가 너무 복잡하다고 생각합니다. 자바 스크립트 / Node.js를 포트 : https://www.npmjs.com/package/email-addresses .

클라이언트에서 데이터의 유효성을 검사하지만 서버에서 유효성을 다시 확인하는 것이 좋습니다. 이를 염두에두고 문자열이 클라이언트에서 유효한 전자 메일 주소처럼 보이는지 확인하고 서버에서 엄격한 검사를 수행 할 수 있습니다.

문자열이 유효한 메일 주소인지 확인하는 데 사용하는 JavaScript 함수는 다음과 같습니다.

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

설명:

  • lastAtPos < lastDotPos: 마지막 @은 서버 이름의 일부가 될 수 없기 .때문에 마지막 @입니다.

  • lastAtPos > 0: 마지막에 무언가 (이메일 사용자 이름)가 있어야합니다 @.

  • str.indexOf('@@') == -1: @@주소 가 없어야합니다 . 경우에도 @이메일 사용자 이름의 마지막 문자로 나타납니다, 그것은 인용되어야하므로 "그 사이에 될 @마지막 @주소입니다.

  • lastDotPos > 2: 마지막 점 앞에 3 자 이상이 있어야합니다 (예 :) a@b.com.

  • (str.length - lastDotPos) > 2: 마지막 점 뒤에 두 문자 도메인을 형성하기에 충분한 문자가 있어야합니다. 괄호가 필요한지 확실하지 않습니다.


이 fn은 멋지게 보이지만 최상위 답변으로 작성된 정규식보다 낫습니까?
Atul Goyal

4
나는 그것을 의심한다. 문자열이 전자 메일처럼 보이는지 확인하고 세부 정보를 서버 측 코드에 남겨두기 위해 사용합니다.
Miloš Rašić

'aaaa'와 같은 문자열을 확인합니다 (예 : '@'및 ').
Gennady Shumakher 2019

1
해서는 안됩니다. lastIndexOf ()는 바늘을 찾지 못하면 -1을 반환해야합니다.
Miloš Rašić

" @이메일 사용자 이름의 마지막 문자로 표시 되더라도 그 주소 와 마지막 주소 "사이에 인용해야 합니다." @@무엇에 대해 "@@"@example.com?
Ry-

47

이것은 http://codesnippets.joyent.com/posts/show/1917 에서 도난당했습니다 .

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

7
이것은 지금까지 인기 필터링 .museum.travel도메인 (인해 4 문자 제한 후 .)
bobobobo

4
{2,4}를 {2,6}으로 바꾸는 것은 문제가되지 않습니다
Anton N

11
@Anton N : 대략 다른 문제들도 있습니다. 마지막 {2,4}은 단지 그 유용한 지표 일뿐입니다 ( "오류를 볼 때 다른 사람들이있을 수 있습니다"). 가장 기본적인 하나의 부족 +로컬 부분에; 이 주석 상자가 너무 작아서 위의 모든 오류 를 지적 할 수 없습니다 .
Piskvor는

37
왜 안 해 return filter.test(email.value);?
MT.

3
@AntonN : 이제 10 개 이상의 문자 TLD ( xn--clchc0ea0b2g2a9gcd)가 있습니다. 여전히 문제가되지 않습니까?
Piskvor 건물 왼쪽

42

이 작업을 수행:

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

왜? RFC 2822를 기반으로 하며 표준 모든 전자 메일 주소를 준수해야합니다. 그리고 왜 당신이 "더 간단한"것으로 귀찮게 할 것인지 잘 모르겠습니다 ... 어쨌든 그것을 복사하여 붙여 넣을 것입니다.)

데이터베이스에 이메일 주소를 저장할 때 종종 소문자로 만들고 실제로 정규 표현식은 대소 문자를 구분하지 않습니다. 이 경우 약간 짧습니다.

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

다음은 JavaScript에서 사용되는 예제입니다 ( i마지막에 대소 문자를 구분하지 않는 플래그 포함 ).

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );

참고 :
기술적으로 일부 이메일은 이전 섹션에서 따옴표를 포함 할 수 있습니다 @(이메일 사용자가 불쾌하고 같은 물건을 포함 할 수 있도록 따옴표 안에 이스케이프 문자와 기호 @"..."그것이 따옴표로 작성만큼). 아무도이 일을하지 않습니다! 더 이상 사용되지 않습니다. 그러나 이는 실제 RFC 2822 표준에 포함되어 있으며 여기서는 생략합니다.

추가 정보 : http://www.regular-expressions.info/email.html


@ Kondal 자바 스크립트 코드는 /i정규 표현식 끝에 플래그 때문에 대소 문자를 구분하지 않습니다 . 대소 문자를 구분하지 않는 비교가 필요하다는 사실을 언급하지만 더 명확하게 설명하겠습니다.
Ryan Taylor

나를 위해 매력으로 일했다
Alex

40

이 문제를 해결하기 위해 정말로 기대하고 있습니다. 그래서 위의 이메일 유효성 검사 정규 표현식을 수정했습니다.

  • 기발한
    /^(([^<>()\[\]\\.,;:\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,}))$/

  • 수정
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

Wikipedia Email Address 의 예제를 전달합니다 .

그리고 당신은 여기에 결과를 볼 수 있습니다 .

여기에 이미지 설명을 입력하십시오


이것은 좋은 해결책처럼 보인다 너무 새로운 TLD를 1 편지 이메일과 함께 작동
마크 휴즈

john..doe@example.com정확하지 않아야합니까? 유효한 코너 케이스입니다.
Valerio Bozz

24

전자 메일인지 확인하기 위해 정규식을 사용하여 입력 문자열의 유효성을 검사해서는 안됩니다. 너무 복잡해서 모든 경우를 다루지는 않습니다.

이제 사례의 90 % 만 처리 할 수 ​​있으므로 다음과 같이 작성하십시오.

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

다듬을 수 있습니다. 예를 들어, 'aaa @'는 유효합니다. 그러나 전반적으로 요점을 얻습니다. 그리고 해결하지 마십시오 ... 간단한 90 % 솔루션이 작동하지 않는 100 % 솔루션보다 낫습니다.

세상은 더 간단한 코드가 필요합니다 ...


15
이렇게하면 너무 많은 유효하지 않은 이메일 주소를 입력 할 수 있으며 이는 쓸모없는 조언입니다.
cazlab

3
전혀 디버깅 할 수있는 것은 아닙니다. 이 스레드에는 "@"가있는 것보다 더 많은 유효성을 검사하는 훌륭한 예가 많이 있습니다.이 예에서는 "u @"를 유효한 전자 메일 주소로 간주 할 수 있습니다. 최소한 도메인 또는 기타 도메인이 있는지 여부를 평가하십시오. 내가 당신을 "공격적으로 게으른 코딩"이라고 부르는 것의 한 예일 것입니다. 나는 그것이 스레드에서 가장 낮은 등급의 답변이므로 왜 당신이 그것을 방어하고 있는지 잘 모르겠습니다.
cazlab

3
@cazlab 아마도 당신이 맞을 것입니다. 결국 나는 투표했다. 위와 같은 코드는 코드 조각을 쉽게 디버깅 할 수 있다고 생각하지는 않습니다. 필요하다면 적어도 '공격적으로 게으른'접근 방식을 개선 할 수 있습니다.
Zo72

3
이것은 정규식을 사용하는 것과 어떻게 다른가요? (.+)@(.*)똑같은 일을하고 더 짧습니다.
snostorm

4
+1-사용자가 최소한 전자 우편 주소를 입력하려고했는지 확인하려는 경우 전자 우편 주소가 전자 우편이 아닌지 확인할 수 있는지 확인하십시오. 훌륭한 솔루션. 사람의 사용자 이름을 전자 메일 주소로 사용하려는 경우를 예로들 수 있습니다. 사용자가 'sexy_chick_23'을 입력하면이 정규식을 사용하여 전자 우편이 예상됨을 알 수 있습니다. 입력 한 내용이 전자 메일처럼 보이지만 사용자는 '확인'전자 메일을받지 못하고 가입 절차는 검증되지 않습니다.
Chris Dutrow

23

입력 한 이메일 주소가 유효한지 HTML을 사용하지 않는지 확인하십시오.

<input type="email"/>

유효성 검사를 위해 함수를 작성할 필요가 없습니다.


4
IE <10은이를 지원하지 않으며 Android 자체 브라우저도 지원하지 않습니다.
Frank Conijn

7
공감. IE <10이 죽었습니다.
Michael Scheper

19

이메일 유효성 검사기를 100 % 정확하게 얻는 것은 어렵습니다. 올바른 방법은 계정에 테스트 이메일을 보내는 것입니다. 즉, 합리적인 것을 얻는 데 도움이되는 몇 가지 기본 검사가 있습니다.

개선해야 할 사항 :

new 대신 다음과 같이 RegExp작성하십시오 regexp.

if (reg.test(/@/))

둘째, 마침표가 @부호 뒤에 오는지 확인하고 @s와 마침표 사이에 문자가 있는지 확인하십시오 .


19

이것은 노드 유효성 검사기 가 수행하는 방식입니다.

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[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]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

14

유효성 검사기 함수 내에서이 코드를 사용하십시오.

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

그렇지 않으면 jQuery 를 사용할 수 있습니다 . 내부 규칙은 다음을 정의합니다.

eMailId: {
    required: true,
    email: true
}

1
abc@xyz정규식으로 인식되지 않는 완벽하게 유효한 이메일입니다.
Toto

3
아닙니다. 올바른 이메일 패턴은 something@something.something입니다. abc @ xyz는 해당 패턴과 일치하지 않습니다. 따라서 올바른 주소가 아닙니다.
Orchid


5
Wikipedia 페이지를 보셨습니까? TLD는 유효한 호스트 이름입니다. 그래서 abc@tld유효한 이메일 주소입니다.
Toto

2
이메일 주소를 확인하는 유일한 방법은 이메일을 보내고 응답을 기다리는 것입니다. 이 외에도, 주소가 RFC822를 준수하는지 테스트 할 수있는 URL은 mythic-beasts.com/~pdw/cgi-bin/emailvalidate 입니다. abc @ xyz가 RFC822에 유효한 주소임을 알 수 있습니다.
Toto

14

정규식 업데이트 2018! 이 시도

let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

타이프 스크립트 버전 완료

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

더 많은 정보 https://git.io/vhEfc


표준 email@domain.com 실패이
릭스

1
@RickS 이것은 단순히 사실이 아닙니다. 다시 확인해주십시오
malimo

13

TLD의 존재를 확인하지 않는 솔루션이 불완전합니다.

이 질문에 대한 거의 모든 답변은 Regex를 사용하여 이메일 주소를 확인하는 것이 좋습니다. Regex는 기본적인 검증에만 적합하다고 생각합니다. 이메일 주소의 확인 확인은 실제로 두 가지 별도의 문제인 것 같습니다.

1- 이메일 형식 확인 : 이메일이 RFC 5322의 이메일 형식 및 패턴을 준수하는지 그리고 TLD가 실제로 존재하는지 확인하십시오. 유효한 모든 TLD 목록은 여기 에서 찾을 수 있습니다 .

예를 들어, 주소 example@example.ccc가 정규식을 통과 하더라도 cccIANA의 최상위 도메인이 아니기 때문에 올바른 이메일 이 아닙니다.

2- 이메일이 실제로 존재하는지 확인 : 이를 위해 유일한 옵션사용자에게 이메일을 보내는 것 입니다.


13

이메일 주소 확인을위한 정규식

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

RFC5322에 정규 표현식이 표시되지 않습니다 : tools.ietf.org/html/rfc5322- 실수가 있습니까?
Kamil Kiełczewski

"최고의 정규식"? 여기에 어떤 종류의 설명이 있습니까?
connectyourcharger

왜 이것이 최선의 해결책이라고 말했습니까? 조금 더 설명해 주시겠습니까?
nancoder

왜 "최고의 정규식"을 작성했는지 기억이 나지 않습니다. 귀찮게된다면 미안합니다.
Prabhat Kasera

12

다음은 정규식을 사용하여 전자 메일 주소의 유효성을 검사하는 방법에 대한 매우 유용한 토론입니다. " 정규식을 검증하는 이메일 주소 비교 "

다음은 참조 용으로 현재 최상위 표현식 (JavaScript 호환 가능)입니다.

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

9
-1 화이트리스트를 작성하면 원하는 부분이 많이 남습니다 .jobs. 특히 놓쳤습니다 . 또한, 라이브 IDN이 있습니다 (대부분의 경우, .中國2010 년 6 월과 같이 귀하의 게시물 이후에만 공개적으로 승인을 받았지만 대부분 수년간 작업에 참여했습니다).
Piskvor는

2
-1 상수 최상위 도메인을 사용하지 않습니다. 항상 (그리고 예를 들어 2013 년이있을 것입니다) 새로운 tld가 추가 될 수 있습니다.
miho

100 개의 새로운 TLD가 확인되었습니다. 이 답변은 유효하지 않으며 사용해서는 안됩니다.
Dean Meehan

예. 나는 2011 년에 그것을 말했고 다시 말할 것이다. "특별한"도메인의 화이트리스트는 더 많은 TLD가 승인됨에 따라 시간이 지남에 따라 악화 될 뿐이다. 위의 허용 된 사이트 목록과 일치하지 않는 100 개 이상의 완전히 유효 TLD에있다 : en.wikipedia.org/wiki/List_of_Internet_top-level_domains은
Piskvor 건물 왼쪽

당신의 표현은 실용적이지 않습니다. 이 답변을 내려야하지만이 표현을 넣은 모든 페이지를 수정하는 데 너무 바쁠 것입니다. 권리?
Eric Leroy 2016


12

squirtle 과 달리 여기에 복잡한 솔루션이 있지만 전자 메일을 올바르게 확인하는 데는 훌륭합니다.

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

다음과 같이 사용하십시오.

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

10
당신은 == true당신의 모범이 필요하지 않습니다 .
Luke Alderton

11

정규 표현에 대한 나의 지식 그렇게 좋지 않습니다. 그렇기 때문에 간단한 정규 표현식으로 일반 구문을 먼저 확인하고 나중에 다른 기능으로 더 구체적인 옵션을 확인합니다. 이것은 최고의 기술 솔루션은 아니지만이 방법으로 더 유연하고 빠릅니다.

내가 겪는 가장 일반적인 오류는 공백 (특히 시작과 끝)과 때로는 이중 점입니다.

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true

10
<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

어쩌면 설명이나 설명을 추가했다면? html을 보여줄 필요는 없다고 생각합니다. 모든 사람들은 자바 스크립트와 정규식입니다. jacascript에 대한 답변을 줄이고 약간의 흐림 효과를 추가하면 공감할 수 있습니다.
bgmCoder 2013 년

9

모든 이메일 주소 테스트 사례를 통과하는 JS의 Regex를 찾고있었습니다.

  • email@example.com 유효한 이메일

  • firstname.lastname@example.com 이메일은 주소 필드에 점을 포함합니다

  • email@subdomain.example.com 이메일에 하위 도메인이있는 점이 있습니다

  • firstname+lastname@example.com 더하기 부호는 유효한 문자로 간주됩니다

  • email@192.0.2.123 도메인은 유효한 IP 주소입니다

  • email@[192.0.2.123] IP 주소 주위의 대괄호는 유효한 것으로 간주됩니다

  • “email”@example.com 이메일에 대한 인용문은 유효한 것으로 간주됩니다

  • 1234567890@example.com 주소의 숫자가 유효합니다

  • email@domain-one.example 도메인 이름의 대시가 유효합니다

  • _______@example.com 주소 필드의 밑줄이 유효합니다

  • email@example.name .name 유효한 최상위 도메인 이름입니다.

  • email@example.co.jp최상위 도메인 이름의 도트도 유효한 것으로 간주됩니다 ( co.jp여기 예제 사용 ).

  • firstname-lastname@example.com 주소 필드의 대시가 유효합니다

여기 우리는 간다 :

http://regexr.com/3f07j

또는 정규식 :

Regex = /(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@[*[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+]*/

8

ASP.NET MVC 내에서 Microsoft가 제공하는 정규식 은 다음과 같습니다.

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

결함이있는 경우 여기에 게시하지만 항상 내 요구에 완벽합니다.


1
이메일 이름 부분에 +를 사용할 수 없습니다.
Paul Go
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.