문제

나는 전화 번호를 검증하기 위해 포괄적 인 동정인을 모 으려고 노력하고 있습니다. 이상적으로는 국제 형식을 처리하지만 다음을 포함하여 미국 형식을 처리해야합니다.

  • 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+))?$
.*

사용자가 귀하에게 전화 번호를 제공하려면 제대로 얻을 수 있도록 신뢰하십시오. 그가 당신에게 그것을주고 싶지 않다면, 유효한 번호를 입력하도록 강요하면 그를 경쟁 업체의 사이트로 보내거나 Regex에 맞는 임의의 문자열을 입력하게됩니다. 나는 심지어 프리미엄 요금 성별 라인의 수를 찾아서 대신 입력하려는 유혹을받을 수도 있습니다.

또한 다음 중 하나를 웹 사이트에서 유효한 항목으로 간주합니다.

"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–2042 a 유효한 미국 번호
    • (999) 974–2042 ~이다 유효하지 않습니다 미국 번호
  • 호주
    • 0404 999 999 a 유효한 호주 번호
    • (02) 9999 9999 또한 a 유효한 호주 번호
    • (09) 9999 9999 ~이다 유효하지 않습니다 호주 번호

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

전화 번호를 테스트하기 위해 간단한 정규 표현식을 건너 뛰고 Google과 같은 라이브러리를 사용하는 것이 좋습니다. libphonenumber (Github 프로젝트 링크).

libphoneMerumber 소개!

더 복잡한 예 중 하나를 사용하여 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 버전은 Java 및 JavaScript 용 코드가 있지만 사람들은 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

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

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

테스트 할 Perl 스크립트가 있습니다. 일치 할 때 $ 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";
        }
}

편집하다:

REGEX에서 w*로 w*로 s* w? s를 변경하여 약간 조일 수 있습니다. 나는 글을 쓸 때 양식에 대한 사용자 입력을 검증하는 측면에서 정규식을 생각하지 않았지만이 변경으로 인해 해당 목적으로 Regex를 사용할 수 있습니다.

'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*))?';

나는 다른 질문에 대해이 질문에 대답했다.이 스레드에 대한 답으로 내 대답을 포함시키기로 결정하기 전에, 아무도 항목을 요구하는 방법을 다루는 방법을 다루지 않았기 때문이다.REGEX는 잘못 작동하여 예기치 않은 것들과 일치합니다

해당 사이트의 내 게시물에서, 나는 자신의 원하는 전화 번호 형식을 위해 자신의 동정인을 만들도록 도와주는 빠른 가이드를 만들었습니다. 원하는 결과를 얻지 못할 수도 있으며 전 세계의 모든 전화 번호를 수락하기위한 "하나의 크기에 맞는"솔루션이 없습니다. 선택 형식으로 받아들이기로 결정한 것만 있습니다. 자신의 위험에 사용하십시오.

빠른 치트 시트

  • 표현 시작 : /^
  • 공간이 필요한 경우 사용하십시오. [\s] 또는 \s
  • 괄호가 필요한 경우 사용하십시오. [(] 그리고 [)] . 사용 \( 그리고 \) 추악하고 혼란 스러울 수 있습니다.
  • 선택 사항이되기를 원한다면 ? 그 후
  • 하이픈을 원한다면 그냥 입력하십시오 - 또는 [-] . 그러나 일련의 다른 캐릭터에서 먼저 또는 지속되지 않으면 탈출해야 할 수도 있습니다. \-
  • 슬롯에서 다른 선택을 수락하려면 옵션 주위에 괄호를 넣으십시오. [-.\s] 하이픈, 기간 또는 공간이 필요합니다. 마지막 괄호 후 물음표는 해당 슬롯의 모든 선택 사항을 만듭니다.
  • \d{3} : 3 자리 번호가 필요합니다 : 000-999. 속기[0-9][0-9][0-9].
  • [2-9] : 해당 슬롯에는 숫자 2-9가 필요합니다.
  • (\+|1\s)? : "플러스"또는 1 및 공간을 수락합니다 (파이프 문자, |,, "또는"), 선택 사항으로 만듭니다. "플러스"표지판을 피해야합니다.
  • 특정 숫자가 슬롯과 일치하도록하려면 다음을 입력하십시오. [246] 2, 4 또는 6이 필요합니다. [77|78] 77 또는 78이 필요합니다.
  • $/ : 표현을 끝내십시오

나는 단순한 것을 썼다 (나는 점이 필요하지 않았지만).

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

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

스트리핑에 유의하십시오 () 캐릭터는 공통적 인 영국 숫자를 쓰는 스타일에 적합하지 않습니다. +44 (0) 1234 567890 이는 국제 번호를 다이얼하는 것을 의미합니다.
+441234567890
또는 영국 다이얼에서 01234567890

현장에 임의의 쓰레기가 없음을 확인하려면 (즉, 형태 스패머)이 regex는 다음과 같습니다.

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

숫자의 수 또는 해당 자릿수에 유효한 숫자에 대한 특별 규칙이 없으므로 숫자, 괄호, 대시, 공간, 파운드, 별표, 기간, 쉼표 또는 문자 만 확인합니다. e, x, t 존재합니다.

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

숫자 당 규칙 당 규칙 (예 : 미국 지역 코드 및 접두사 (Exchange Codes)와 같은 200-999의 범위에 속해야 함)를 유지하려면 행운을 빕니다. 세계 어느 나라에서나 미래의 어느 시점에서도 구식이 될 수있는 복잡한 규칙 설정을 유지하는 것은 재미 있지 않습니다.

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

당신은 살펴 보셨습니까? 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

양식 검증에 대해 이야기하고 있다면, 올바른 데이터뿐만 아니라 올바른 의미를 검증하기위한 Regexp는 다양한 국가와 제공자 표준으로 인해 매우 복잡 할 것입니다. 또한 최신 상태를 유지하기가 어려울 것입니다.

이 질문은 내부적으로 일관되지 않을 수있는 광범위하게 유효한 패턴을 찾는 것으로 해석합니다. 예를 들어 유효한 숫자 세트를 가지고 있지만 트렁크 라인, 교환 등을 국가 코드 접두사의 유효한 패턴으로 확인하지는 않습니다. .

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

^((((\(\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. 미국의 대부분의 휴대 전화는 그것을 요구하지 않으며, 국제적으로 전화를 걸지 않으면 젊은 세대를 당황하게하기 시작합니다.

당신은 그것이 까다로운 문제라는 것을 정확하게 식별했습니다 ...

-아담

다음은 내가 달성하는 데 필요한 검증과 가장 밀접하게 일치하는 멋진 패턴입니다. 나는 원래 작가는 아니지만,이 문제가 매우 복잡하고 간결하거나 널리 유용한 대답이 없다는 것을 알았 기 때문에 공유 할 가치가 있다고 생각합니다.

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

/^\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
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292

부정적인:
926 3 4
8 800 600- 애플

원본 출처 : 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})/

모든 전화 번호를 전화 : 링크로 바꾸는 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;
}

나는 믿는다 번호 :: 전화 :: 우리 그리고 regexp :: common (특히 원천 regexp :: common :: uri :: rfc2806) Perl 모듈이 도움이 될 수 있습니다.

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

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

사용자 입력을 검증하려는 경우 결과를 정규화하고 수행하지 않겠습니까? 사용자가 숫자를 넣으면 유효한 숫자로 인식 할 수없는 경우 입력으로 저장하거나 분할 할 수없는 문자를 제거하십시오. 그만큼 번호 :: 전화 :: 정규화 Perl 모듈은 영감의 원천이 될 수 있습니다.

나는 시장 조사 회사에서 일하고 있으며 이러한 유형의 입력을 걸러 내야합니다. 당신은 그것을 너무 많이 복잡하게하고 있습니다. 비 알파럼 성 숯을 제거하고 확장이 있는지 확인하십시오.

추가 분석을 위해 유효한 숫자의 데이터베이스에 액세스 할 수있는 많은 공급 업체 중 하나를 구독 할뿐만 아니라 유합식 또는 모바일, 연결이 끊어진 등을 알려줄 수 있습니다. 비용이 많이 듭니다.

문자 서식을 교체 한 다음 나머지 전화 유효성을 확인하십시오. PHP에서

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

이와 같이 복잡한 Regexp를 깨는 것은 효과적이지만 훨씬 간단 할 수 있습니다.

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

<?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.';
}
?>

이를 위해 마스크 입력을 사용하는 것이 더 나을 것입니다. 이렇게하면 사용자가 숫자 만 입력 할 수 있으며 적합하지만 포맷 할 수 있습니다. 이것이 웹 애플리케이션에 대한 것인지 확실하지 않지만,이 경우 클릭 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, 그것을 예쁘게 유지해야 할 진짜 이유가 없습니다. 그런 종류의 동정인은 나에게 이와 같은 무언가가 나올 것입니다.

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

저의 성향은 비 독점을 벗기고 가장 좋은 것을 받아들이는 것에 동의하는 것입니다. 예를 들어 알파시 전화 번호 "Ask-Jake"와 같은 것을 금지하지만 적어도 몇 자리 숫자가 존재하도록 할 수 있습니다.

몇 가지 간단한 perl 표현이 다음과 같습니다.

@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();
});


});

원천.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top