일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 네트워크
- 파이썬
- 인공지능
- 머신러닝
- 컴퓨터공학
- 데이터구조
- 버전관리
- 딥러닝
- 소프트웨어
- 보안
- 알고리즘
- 프로그래밍언어
- 데이터베이스
- 사이버보안
- 프로그래밍
- 데이터과학
- 웹개발
- 네트워크보안
- 자료구조
- 클라우드컴퓨팅
- 코딩
- 2
- Yes
- 컴퓨터비전
- 소프트웨어공학
- 데이터분석
- I'm Sorry
- 빅데이터
- 자바스크립트
- 컴퓨터과학
- Today
- Total
스택큐힙리스트
어떻게 정규 표현식을 사용하여 이메일 주소를 확인할 수 있을까요? 본문
여러 해 동안 저는 서서히 대부분의 전자 메일 주소를 올바르게 확인하는 'regular expression' 를 개발해 왔습니다. 서버 부분으로 IP 주소를 사용하지 않는다는 가정 하에 올바르게 확인됩니다.
나는 여러 PHP 프로그램에서 이를 사용하며 대부분 작동합니다. 하지만 가끔씩 이를 사용하는 사이트에 문제가 있는 사람들로부터 연락을 받아 일부 조정을 해야 하는 경우가 있습니다 (가장 최근에는 네 글자인 'TLDs'을(를) 허용하고 있지 않았음을 깨달았습니다).
당신이 가지고 있는 최고의 이메일 유효성 검사를 위한 정규 표현식은 무엇인가요?
나는 여러 개의 짧은 표현을 사용하는 함수들을 사용한 다양한 해결책을 보았지만, 나는 복잡한 함수보다는 한 개의 긴 복잡한 표현을 간단한 함수에 가지는 것을 선호합니다.
답변 1
'fully RFC 822 compliant regex'은 길이 때문에 비효율적이고 모호합니다. 다행히도, RFC 822는 두 번이나 대체되었고, 현재의 이메일 주소에 대한 명세는 'RFC 5322'입니다. RFC 5322는 몇 분 동안 공부하면 이해할 수 있는 정규식을 제공하며, 실제 사용에 충분히 효과적입니다.
한 개의 RFC 5322 규격에 맞는 정규식은 페이지 맨 위에서 찾아볼 수 있습니다. 그러나 이 정규식은 인터넷에서 유효하지 않은 IP 주소 패턴을 사용하고 있으며 점으로 구분된 주소에서 부호 없는 바이트 10진 값($#$&!$&)을 허용하는 버그가 있습니다. 그 외의 부분은 RFC 5322 문법과 일치하며, 도메인 이름, IP 주소, 잘못된 주소, 따옴표 있는지 여부에 상관없이 계정 이름을 포함한 몇 가지 테스트를 통과합니다.
IP 패턴의 '00' 버그를 수정하여 작동되고 꽤 빠른 정규식을 얻을 수 있습니다. (웹페이지 버전에서 실제 코드를 가져오기 위해 마크다운이 아닌 렌더링된 버전을 스크래이핑합니다.)
(?:[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])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-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])+)\])
또는:
'(?:[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])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-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])+)\])
'
당신은 컴퓨터 전문가입니다. 퍼울(PERL)과 PCRE(PCRE)에서 더 정교한 패턴은!'correctly parse RFC 5322 without a hitch' 심볼을 사용할 수 있습니다. 파이썬과 C#도 가능하지만, 첫 두 가지와는 다른 구문을 사용합니다. 그러나 덜 강력한 패턴 일치 언어 중 하나를 사용해야 하는 경우, 실제 파서를 사용하는 것이 가장 좋습니다.
RFC에 따른 유효성을 검증하는 것은 주어진 도메인에서 해당 주소가 실제로 존재하는지 또는 주소를 입력한 사람이 실제 소유자인지에 대해 아무 정보도 알려주지 않는다는 사실을 이해하는 것도 중요합니다. 사람들은 이런 식으로 다른 사람을 메일링 리스트에 가입시킵니다. 이를 수정하려면 주소에 확인 토큰이 포함된 메시지를 보내어 주소와 동일한 웹 페이지에서 입력할 수 있도록 하는 더 복잡한 유효성 검증이 필요합니다.
확인 토큰은 주소가 입력된 사람을 알 수 있는 유일한 방법입니다. 그래서 대부분의 메일링 리스트는 이 메커니즘을 사용하여 가입을 확인합니다. 결국 누구나 'president@whitehouse.gov'을(를) 기입할 수 있지만, 이는 법적으로 해석될 수 있지만 반드시 상대방이 아닐 가능성이 큽니다.
PHP를 위해, 나는 인용한 문자열인 'Validate an E-Mail Address with PHP, the Right Way'에서 제공된 패턴을 사용하지 않아야합니다.
일반 사용과 널리 퍼진 형편없는 코딩으로 인해 이메일 주소에 대한 사실상의 표준이 기록된 공식 표준보다 더 제한적일 수 있는 위험이 있습니다.
그것은 다른 비-RFC 패턴들과 별반 다르지 않습니다. 그것은 심지어 'RFC 822' 와 같은 것조차 처리할 만큼 충분히 똑똑하지 않습니다. 하지만 'This one' , 그렇습니다, RFC 5322를 처리할 수 있습니다.
만약 특이하고 까다롭게 하려면, 'implement a complete state engine' . 일반적인 정규 표현식은 단순한 필터로만 작용합니다. 정규 표현식의 문제는 사용자의 관점에서 정말로 유효한 이메일 주소를 잘못된 것으로 처리하는 건 무례하고 예의 없다는 겁니다. 상태 엔진은 RF에 따라 이메일 주소를 분해함으로써 유효하지 않다고 간주되는 이메일 주소를 검증하고 심지어 수정할 수 있게 해주기 때문에 더 기쁜 경험이 될 수 있습니다.
지정된 이메일 주소 'myemail@address,com'은(는) 잘못되었습니다. 'myemail@address.com'를 의미하셨나요?
또한 'Validating Email Addresses' , 그에 포함된 주석들을 참조하십시오. 혹은 'Comparing E-mail Address Validating Regular Expressions' .
'Debuggex Demo'
답변 2
이메일 주소를 정규 표현식을 사용하여 유효성을 검증하는 방법을 알아보겠습니다.이메일 주소 유효성 검사는 웹 애플리케이션에서 사용자가 올바른 형식의 이메일 주소를 제출하는지 확인하는 중요한 과정입니다. 이를 위해 정규 표현식을 사용할 수 있으며, 정확한 형식을 표현하기 위해 몇 가지 패턴을 사용합니다.
우선, 이메일 주소는 이름@도메인.도메인확장자 형식을 따릅니다. 이 형식을 만족하는지 확인하기 위해 다음의 정규 표현식을 사용할 수 있습니다:
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
이 정규식을 분석해보겠습니다:
- ^ : 문자열의 시작 부분을 의미합니다.
- [a-zA-Z0-9_.+-]+ : 이메일 주소의 이름 부분을 표현하는데, 알파벳 대소문자, 숫자, 그리고 일부 특수문자(예: ., _, +, -)가 포함될 수 있습니다.
- @ : 이메일 주소에서 이름과 도메인 사이를 구분하는 기호입니다.
- [a-zA-Z0-9-]+ : 이메일 주소의 도메인 부분을 표현하는데, 알파벳 대소문자, 숫자, 그리고 하이픈(-)이 포함될 수 있습니다.
- \. : 이메일 주소의 도메인과 확장자 사이를 구분하는 마침표(.)입니다.
- [a-zA-Z0-9-.]+ : 이메일 주소의 확장자 부분을 표현하는데, 알파벳 대소문자, 숫자, 그리고 마침표(.)와 하이픈(-)이 포함될 수 있습니다.
- $ : 문자열의 끝 부분을 의미합니다.
이 정규식은 이메일 주소가 주어진 형식을 정확히 따르는지 확인합니다. 하지만, 이메일 주소가 형식상 올바르더라도 실제로 존재하는지를 보장하지는 않습니다. 따라서 실제 메일 서버에 요청을 보내 확인하는 추가적인 단계가 필요합니다.
이렇게 이메일 주소를 정규 표현식을 사용하여 검증하는 것은 중요한 보안 요소입니다. 유저들이 올바른 형식의 이메일 주소를 입력하도록 유도하고, 악의적인 사용자로부터의 공격을 방어할 수 있습니다. 이를 통해 웹사이트 사용자 경험을 개선하고 안전한 온라인 환경을 제공할 수 있습니다.
복잡한 기술 용어를 사용하지 않으면서 이메일 주소 유효성 검사에 대한 설명을 적용하여, 이 글은 검색 엔진 최적화에 기여할 것입니다.