developer tip

전화 번호 확인을위한 포괄적 인 정규식

copycodes 2020. 9. 28. 09:19
반응형

전화 번호 확인을위한 포괄적 인 정규식


전화 번호의 유효성을 검사하기 위해 포괄적 인 정규식을 모 으려고합니다. 이상적으로는 국제 형식을 처리하지만 다음을 포함한 미국 형식을 처리해야합니다.

  • 1-234-567-8901
  • 1-234-567-8901 x1234
  • 1-234-567-8901 ext1234
  • 1 (234) 567-8901
  • 1.234.567.8901
  • 1/234/567/8901
  • 12345678901

나는 현재의 시도로 대답 할 것이지만 누군가가 더 좋고 / 또는 더 우아한 것을 가지고 있기를 바랍니다.


더 나은 옵션 ... 입력시 숫자가 아닌 모든 문자 ( 'x'및 선행 '+'기호 제외)를 제거하고, +44 (0) ...국제 접두사를 사용하도록 요청할 때 비표준 형식으로 숫자를 쓰는 영국 경향 때문에주의를 기울입니다. (이 경우에는 (0)완전히 버려야합니다 ).

그런 다음 다음과 같은 값으로 끝납니다.

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

그런 다음 표시 할 때 마음 내용을 다시 포맷하십시오. 예 :

  1 (234) 567-8901
  1 (234) 567-8901 x1234

적어도 북미에서는 NANP 라고하는 사양이 있습니다.

원하는 것을 정확히 지정해야합니다. 법적 구분자는 무엇입니까? 공백, 대시 및 마침표? 구분자가 허용되지 않습니까? 구분 기호 하나를 혼합 할 수 있습니까 (예 : + 0.111-222.3333)? 확장 (예 : 111-222-3333 x 44444)은 어떻게 처리됩니까? 911과 같은 특수 번호는 어떻습니까? 지역 번호가 선택 사항입니까 아니면 필수입니까?

다음은 확장이 허용되는 7 자리 또는 10 자리 숫자에 대한 정규식입니다. 구분 기호는 공백, 대시 또는 마침표입니다.

^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

.*

사용자가 자신의 전화 번호를 제공하고자한다면 그 사람이 올바른 전화 번호를 알려줄 것이라고 믿으십시오. 그가 당신에게 그것을주고 싶지 않으면 유효한 번호를 입력하도록 강제하면 경쟁자의 사이트로 보내거나 정규식에 맞는 임의의 문자열을 입력하게됩니다. 프리미엄 요금 섹스 라인의 번호를 찾아서 대신 입력하고 싶을 수도 있습니다.

또한 다음 중 웹 사이트의 유효한 항목으로 간주합니다.

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"

또한 " libphonenumber "Google 라이브러리를 살펴볼 것을 제안 합니다. 나는 그것이 정규식이 아니라는 것을 알고 있지만 정확히 원하는 것을 수행합니다.

예를 들어 다음을 인식합니다.

15555555555

은 가능한 숫자이지만 유효한 숫자가 아닙니다. 또한 미국 이외의 국가도 지원합니다.

기능의 하이라이트 :

  • 전 세계 모든 국가 / 지역의 전화 번호를 구문 분석 / 형식화 / 검증합니다.
  • getNumberType-숫자 자체를 기반으로 숫자 유형을 가져옵니다. 유선, 모바일, 수신자 부담, 프리미엄 요금, 공유 비용, VoIP 및 개인 번호 (가능할 때마다)를 구분할 수 있습니다.
  • isNumberMatch -두 숫자가 같은지 여부에 대한 신뢰 수준을 얻습니다.
  • getExampleNumber/ getExampleNumberByType-필요한 전화 번호 유형을 지정하는 옵션과 함께 모든 국가 / 지역에 유효한 예시 번호를 제공합니다.
  • isPossibleNumber -전체 유효성 검사보다 훨씬 빠른 길이 정보 만 사용하여 번호가 가능한 전화 번호인지 빠르게 추측합니다.
  • isValidNumber -길이 및 접두사 정보를 사용하여 지역에 대한 전화 번호의 전체 유효성 검사.
  • AsYouTypeFormatter -사용자가 각 숫자를 입력 할 때 즉시 전화 번호 형식을 지정합니다.
  • findNumbers -텍스트 입력에서 숫자를 찾습니다.
  • PhoneNumberOfflineGeocoder -전화 번호와 관련된 지리적 정보를 제공합니다.

전화 번호 확인의 가장 큰 문제는 문화적으로 매우 의존적이라는 것입니다.

  • 미국
    • (408) 974–2042A는 유효한 미국 번호
    • (999) 974–2042유효한 미국 번호 아닙니다.
  • 호주
    • 0404 999 999A는 유효한 호주의 수는
    • (02) 9999 9999유효한 호주 번호 이기도합니다.
    • (09) 9999 9999유효한 호주 번호 아닙니다.

정규식은 전화 번호 형식을 확인하는 데 적합하지만 실제로 전화 번호 유효성 을 확인할 수는 없습니다.

전화 번호를 테스트하기 위해 간단한 정규 표현식을 건너 뛰고 Google의 libphonenumber(link to GitHub project) 같은 라이브러리를 사용하는 것이 좋습니다 .

libphonenumber를 소개합니다!

보다 복잡한 예제 중 하나 인을 사용하여 (link to online demo) 에서 다음 데이터1-234-567-8901 x1234 를 얻 습니다libphonenumber .

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results:

E164 format                    +12345678901
Original format                (234) 567-8901 ext. 123
National format                (234) 567-8901 ext. 123
International format           +1 234-567-8901 ext. 123
Out-of-country format from US  1 (234) 567-8901 ext. 123
Out-of-country format from CH  00 1 234-567-8901 ext. 123

따라서 전화 번호가 유효한지 (유효한지) 알 수있을뿐만 아니라 로케일에서 일관된 전화 번호 형식을 얻을 수 있습니다.

보너스 libphonenumber로 전화 번호의 유효성을 확인하기위한 여러 데이터 세트가 있으므로 +61299999999(의 국제 버전 (02) 9999 9999) 과 같은 번호를 확인하면 형식이 지정된 유효한 숫자로 반환됩니다.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results

E164 format                    +61299999999
Original format                61 2 9999 9999
National format                (02) 9999 9999
International format           +61 2 9999 9999
Out-of-country format from US  011 61 2 9999 9999
Out-of-country format from CH  00 61 2 9999 9999

libphonenumber는 또한 전화 번호가 감지 된 위치를 파악하고 전화 번호에서 시간대 정보를 가져 오는 것과 같은 많은 추가 이점을 제공합니다.

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

그러나 잘못된 호주 전화 번호 ( (09) 9999 9999)는 유효한 전화 번호가 아님을 반환합니다.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Google 버전에는 자바 및 자바 스크립트 용 코드가 있지만 사람들은 Google i18n 전화 번호 데이터 세트를 사용하는 다른 언어 용 라이브러리도 구현했습니다.

항상 하나의 로케일에서 번호를 받아들이고 항상 하나의 형식이 될 것이라고 확신하지 않는 한, 이에 대한 코드를 직접 작성하지 말고 전화 번호를 확인하고 표시하는 데 libphonenumber를 사용하는 것이 좋습니다.


/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

다음과 일치합니다.

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973

$ n에서 다음을 저장합니다.

  1. 국가 표시기
  2. 전화 번호
  3. 신장

https://www.regexpal.com/?fam=99127에서 테스트 할 수 있습니다.


모든 공백을 제거하는 대답은 깔끔하지만 정규식을 찾는 문제가 실제로 해결되지는 않습니다. 예를 들어 웹 페이지를 다운로드하고 정규식을 사용하여 모든 전화 번호를 추출하는 테스트 스크립트를 살펴 보겠습니다. 어쨌든 정규식이 필요하기 때문에 정규식이 모든 작업을 수행하도록 할 수도 있습니다. 나는 이것을 생각 해냈다.

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

여기에 그것을 테스트하는 펄 스크립트가 있습니다. 일치하면 $ 1에는 지역 번호가 포함되고 $ 2와 $ 3에는 전화 번호가 포함되며 $ 5에는 내선 번호가 포함됩니다. 내 테스트 스크립트는 인터넷에서 파일을 다운로드하고 그 안에있는 모든 전화 번호를 인쇄합니다.

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"1-234-567-8901",
"1-234-567-8901 x1234",
"1-234-567-8901 ext1234",
"1 (234) 567-8901",
"1.234.567.8901",
"1/234/567/8901",
"12345678901",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

편집하다:

정규식에서 \ W *를 \ s * \ W? \ s *로 변경하여 약간 강화할 수 있습니다. 예를 들어 양식을 작성할 때 양식에 대한 사용자 입력의 유효성을 검사하는 관점에서 정규식을 생각하지 않았지만 이러한 변경으로 인해 해당 목적으로 정규식을 사용할 수 있습니다.

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

: 나는 아무도 항목, 정규식 등에서 특정 요소를 뽑아 오기 밖으로 다만 나눠 필요로하지 / 요구하는 방법을 해결하지 않았기 때문에,이 스레드에 대한 답변으로 내 대답을 포함하도록 결정하기 전에 다른 SO 질문에이 질문에 대답 예상치 못한 일을 일치, 정규식 잘못된 작업을

해당 사이트에 대한 내 게시물에서 원하는 전화 번호 형식에 대해 자신의 정규식을 만드는 데 도움이되는 빠른 가이드를 만들었습니다. 다른 사이트에서했던 것처럼 너무 제한적일 경우주의해야합니다. 원하는 결과를 얻지 못할 수 있으며 전 세계에서 가능한 모든 전화 번호를 받아들이는 "한 가지 크기"솔루션이 없습니다. 선택한 형식으로 받아들이기로 결정한 것만 가능합니다. 자신의 책임하에 사용하십시오.

빠른 치트 시트

  • 표현식 시작 : /^
  • 공백이 필요하면 다음을 사용하십시오. [\s]또는\s
  • 괄호가 필요하면 다음을 사용하십시오. [(][)]. \(사용 \)은 추하고 일을 혼란스럽게 만들 수 있습니다.
  • 선택 사항이 필요하면 ?뒤에 추가하십시오.
  • 하이픈을 원하면 -또는을 입력하십시오 [-]. 그러나 일련의 다른 문자에서 첫 번째 또는 마지막에 넣지 않으면 이스케이프해야 할 수 있습니다.\-
  • 슬롯에서 다른 선택을 허용하려면 옵션을 대괄호로 묶습니다 [-.\s]. 하이픈, 마침표 또는 공백이 필요합니다. 마지막 대괄호 뒤에 물음표가 있으면 해당 슬롯에 대해 모든 옵션이 선택됩니다.
  • \d{3}: 000-999의 3 자리 숫자가 필요합니다. 속기 [0-9][0-9][0-9].
  • [2-9] : 해당 슬롯에 숫자 2-9가 필요합니다.
  • (\+|1\s)?: "플러스"또는 1과 공백 (파이프 문자,, |"또는")을 허용하고 선택 사항으로 만듭니다. "더하기"기호는 이스케이프해야합니다.
  • 특정 번호가 슬롯과 일치하도록 [246]하려면 입력하십시오. 2, 4 또는 6 [77|78]이 필요합니다. 77 또는 78이 필요합니다.
  • $/ : 표현 종료

나는 가장 간단하게 썼다 (하지만 점이 필요하지 않았다).

^ ([0-9 \ (\) \ / \ + \-] *) $

아래에서 언급했듯이 구조 / 순서가 아닌 문자 만 확인합니다.


필드에 임의의 가비지가 없는지 확인하고 싶다면 (즉, 양식 스패머에서)이 정규식은 잘 수행해야합니다.

^[0-9+\(\)#\.\s\/ext-]+$

숫자 수 또는 해당 숫자에 유효한 숫자에 대한 특별한 규칙은 없으며 숫자, 괄호, 대시, 더하기, 공백, 파운드, 별표, 마침표, 쉼표 또는 문자 만 확인합니다. e,이 x( t가) 있습니다.

국제 번호 및 현지화 형식과 호환되어야합니다. 일부 지역에 대해 정사각형, 곱슬 또는 꺾쇠 괄호를 허용해야 할 필요가 있습니까? (현재 그들은 포함되어 있지 않습니다).

숫자 단위 규칙 (예 : 미국 지역 번호 및 접두어 (교환 코드)은 200-999 범위에 속해야 함)을 유지하려면 행운을 빕니다. 전 세계 어느 국가에서나 미래의 어느 시점에서나 구식이 될 수있는 복잡한 규칙 집합을 유지하는 것은 재미 있지 않습니다.

그리고 모든 / 대부분의 숫자가 아닌 문자를 제거하는 동안 서버 측에서 잘 작동 할 수 있지만 (특히 이러한 값을 다이얼러에 전달할 계획 인 경우) 특히 유효성 검사 중에 사용자 입력을 스 래시하고 싶지 않을 수 있습니다. 다른 필드에서 수정하십시오.


()일반적으로 영국 번호를 쓰는 스타일에는 문자 제거 가 작동하지 않습니다. +44 (0) 1234 567890즉, 국제 전화 번호
+441234567890
또는 영국 전화 번호로 전화를 겁니다.01234567890


RegExLib를 살펴 보셨습니까 ?

미국 전화 번호를 입력하면 상당히 많은 가능성이 있습니다.


제한없는 정규식 시도 :

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

허용 :

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

거부 :

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

디스플레이를 위해 소독하는 것은 귀하에게 달려 있습니다. 유효성을 확인한 후에 는 숫자 있습니다.


나는 이것이 아주 잘 작동한다는 것을 알았습니다.

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

다음 숫자 형식에서 작동합니다.

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050

확인하려면 전역 및 여러 줄 플래그를 사용해야합니다.

링크 : http://www.regexr.com/3bp4b


양식 유효성 검사에 대해 이야기하는 경우 올바른 의미와 올바른 데이터를 확인하는 정규 표현식은 다양한 국가 및 공급자 표준으로 인해 매우 복잡 할 것입니다. 최신 상태를 유지하는 것도 어려울 것입니다.

나는이 질문을 내부적으로 일치하지 않을 수있는 광범위하게 유효한 패턴을 찾는 것으로 해석합니다. 예를 들어 유효한 번호 집합을 가지고 있지만 트렁크 라인, 교환 등이 국가 코드 접두사에 대한 유효한 패턴으로 검증되지 않았습니다. .

북미는 간단하며 국제적으로는 사람들이 번호를 지정하고 기억하는 방식을 다루는 '특이 적'패턴을 사용하는 것을 선호합니다.

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

북미 패턴은 하나의 괄호가 포함되면 둘 다 포함됩니다. 선택적 이니셜 '+'및 국가 코드에 대한 국제 계정입니다. 그 후, 당신은 관용구에 있습니다. 유효한 일치는 다음과 같습니다.

  • (xxx)xxx-xxxx
  • (xxx)-xxx-xxxx
  • (xxx)xxx-xxxx x123
  • 12 1234 123 1 x1111
  • 12 12 12 12 12
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

내 경험이 북미, 유럽 및 아시아의 일부로 제한되어 있기 때문에 편향 될 수 있습니다.


내 직감은이 주제에 대한 답글의 양에 의해 강화됩니다.이 문제에 대한 해결책은 사실상 무한하지만 어느 것도 우아하지 않을 것입니다.

솔직히 전화 번호를 확인하지 않는 것이 좋습니다. 모든 다른 합법적 인 형식을 허용하는 크고 털이 많은 유효성 검사기를 작성할 수 있더라도 처음에는 전화 번호와 거의 유사한 것을 거의 허용하지 않을 것입니다.

제 생각에 가장 우아한 해결책은 최소 길이를 검증하는 것입니다.


다음은 필리핀 휴대 전화 번호에 대한 간단한 정규식 패턴입니다.

((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

또는

((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

다음과 일치합니다.

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  

첫 번째는 두 자리 국가 코드와 일치하고 두 번째는 필리핀 국가 코드와 만 일치합니다.

여기에서 테스트하세요 : http://refiddle.com/1ox


단일 / 간단한 정규식으로 국제 전화 번호를 처리 하는 데 어려움을 겪을 것입니다. 국제 전화 번호의 어려움에 대한 이 게시물참조 하세요 .

처음 몇 자리를 파싱하여 국가 코드가 무엇인지 확인한 다음 국가에 따라 다르게 작동 할 수 있습니다.

그 외에도-귀하가 제공 한 목록에는 다른 일반적인 미국 형식이 포함되어 있지 않습니다. 이니셜 1은 생략합니다. 미국의 대부분의 휴대 전화는이 형식을 필요로하지 않으며 국제 전화를 걸지 않는 한 젊은 세대를 당황하게 할 것입니다.

까다로운 문제임을 올바르게 식별했습니다 ...

-아담


여기 내가 달성해야하는 검증과 가장 근접한 멋진 패턴이 있습니다. 저는 원저자가 아니지만이 문제가 매우 복잡하고 간결하거나 널리 유용한 답변이 없다는 것을 알았 기 때문에 공유 할 가치가 있다고 생각합니다.

다음 정규식은 다양한 글로벌 전화 번호 형식에서 널리 사용되는 숫자 및 문자 조합을 포착합니다.

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

긍정적 :
+42 555.123.4567
+ 1- (800) -123-4567
+7 555 1234567
+7 (926) 1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567 469123
45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456 202555
4567
4035555678
1 416555 9292

부정적 :
926 34 8800600
-APPLE

원본 출처 : http://www.regexr.com/38pvb


지금까지 최선을 다했습니다. 위의 형식을 처리하지만 다른 가능한 형식이 누락되어 있다고 확신합니다.

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$

이 답변을 읽은 후에는 여러 텍스트를 구문 분석하고 어떤 형식 (더하기 기호가 있거나없는 국제 전화 번호 포함)으로 전화 번호를 가져올 수있는 간단한 정규 표현식이 없었던 것 같습니다.

다음은 최근에 클라이언트 프로젝트에서 사용한 것입니다. 여기서는 모든 형식의 모든 전화 번호를 tel : links로 변환해야했습니다.

지금까지 그들이 던진 모든 것과 함께 작동했지만 오류가 발생하면이 답변을 업데이트하겠습니다.

정규식 :

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

모든 전화 번호를 tel : 링크로 바꾸는 PHP 기능 (호기심이있는 사람이있는 경우) :

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}

내가 생각 번호 : 전화 : 미국정규 표현식 : 공통 (특히 소스 정규 표현식 :: 공통을 :: URI는 : : RFC2806 ) 펄 모듈을 도울 수 있습니다.

질문은 숫자의 유효성을 검사하는 목적을 설명하기 위해 좀 더 자세히 지정해야합니다. 예를 들어, 911은 미국에서 유효한 번호이지만 911x는 x 값이 아닙니다. 전화 회사에서 전화 걸기 완료시기를 계산할 수 있습니다. 이 문제에는 몇 가지 변형이 있습니다. 그러나 정규식은 지역 번호 부분을 확인하지 않으므로 문제가되지 않는 것 같습니다.

이메일 주소 확인과 마찬가지로 유효한 결과가 있더라도 시도 할 때까지 누군가에게 할당되었는지 알 수 없습니다.

사용자 입력의 유효성을 검사하려는 경우 결과를 정규화하고 수행하지 않는 이유는 무엇입니까? 사용자가 유효한 숫자로 인식 할 수없는 숫자를 입력하면 입력 한대로 저장하거나 손상되지 않는 문자를 제거합니다. 번호 : 전화 : 표준화 펄 모듈은 영감의 원천이 될 수 있습니다.


저는 시장 조사 회사에서 일하며 이러한 유형의 입력을 항상 필터링해야합니다. 당신은 그것을 너무 복잡하게 만들고 있습니다. 영숫자가 아닌 문자를 제거하고 확장자가 있는지 확인하십시오.

추가 분석을 위해 유효한 번호 데이터베이스에 대한 액세스를 제공 할뿐만 아니라 유선 또는 휴대폰인지, 연결이 끊겼는지 등을 알려주는 많은 제공 업체 중 하나에 가입 할 수 있습니다. 비용이 듭니다.


문자 형식을 바꾸고 남은 전화의 유효성을 확인하십시오. PHP에서

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

이와 같이 복잡한 정규 표현식을 깨는 것도 효과적 일 수 있지만 훨씬 더 간단합니다.


흥미로운 점을 발견했습니다. 나는 그것을 테스트하지 않았지만 그것이 작동하는 것처럼 보입니다.

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>

이를 위해 Masked Input을 사용하는 것이 더 나을 것입니다. 이렇게하면 사용자는 숫자 만 입력 할 수 있으며 적절하다고 판단되는 형식을 지정할 수 있습니다. 이것이 웹 애플리케이션 용인지 확실하지 않지만,이 작업을 수행하기위한 몇 가지 옵션을 제공하는 매우 클릭 jQuery 플러그인이있는 경우.

http://digitalbush.com/projects/masked-input-plugin/

튜토리얼에서 전화 번호 입력을 마스킹하는 방법도 설명합니다.


다음은 JavaScript에서 잘 작동하는 것입니다. Dojo 위젯이 예상 한 것이기 때문에 문자열에 있습니다.

선택적 확장이있는 10 자리 북미 NANP 번호와 일치합니다. 공백, 대시 및 마침표가 허용되는 구분 기호입니다.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

나는 동일한 문제로 어려움을 겪고 내 응용 프로그램을 미래의 증거로 만들려고 노력했지만이 사람들은 나를 올바른 방향으로 이끌었습니다. 나는 실제로 번호 자체를 확인하여 작동하는지 확인하는 것이 아니라 확장이있을 수도 있고 없을 수도있는 일련의 숫자가 입력되었는지 확인하려고합니다.

최악의 경우 사용자가 XML 파일에서 형식이 지정되지 않은 번호를 가져와야하는 경우 전화 번호판에 번호를 입력하기 만하면 012345678x5됩니다. 그런 종류의 RegEx는 다음과 같이 나옵니다.

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

내 성향은 숫자가 아닌 것을 제거하고 거기에있는 것을 받아들이는 것이 가장 좋다는 데 동의하는 것입니다. 예를 들어 알파벳 전화 번호 "ASK-JAKE"와 같은 것을 금지하지만 적어도 두 자리 숫자가 있는지 확인하는 것이 좋습니다.

몇 가지 간단한 펄 표현식은 다음과 같습니다.

@f = /(\d+)/g;
tr/0-9//dc;

첫 번째 것을 사용하여 숫자 그룹을 함께 유지하면 형식화 단서를 제공 할 수 있습니다. 두 번째 것을 사용하여 숫자가 아닌 모든 것을 사소하게 던지십시오.

잠시 멈춘 다음 더 많은 키를 입력해야 할 수도 있다는 걱정입니까? 아니면 555-1212 (신호음 대기) 123과 같은 것입니까?


    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

숫자로 끝나야하며 (또는 + 또는 숫자로 시작할 수 있으며 +-(또는)를 포함 할 수 있습니다.


아일랜드 휴대 전화 번호로 유사한 작업을 수행하는 데 관심이있는 사람을 위해 다음과 같은 간단한 방법이 있습니다.

http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

해당 링크에는 JQuery 솔루션도 있습니다.

편집하다:

jQuery 솔루션 :

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

소스 .

참고 URL : https://stackoverflow.com/questions/123559/a-comprehensive-regex-for-phone-number-validation

반응형