正規表現を使用して電話番号を検証する方法

950
Nicholas Trandem 2008-09-24 10:13.

電話番号を検証するために、包括的な正規表現をまとめようとしています。理想的には国際フォーマットを処理しますが、次のような米国フォーマットを処理する必要があります。

  • 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

私は現在の試みで答えますが、誰かがより良いおよび/またはよりエレガントな何かを持っていることを望んでいます。

30 answers

525
scunliffe 2008-09-24 10:35.

より良いオプション...入力の数字以外の文字(「x」と先頭の「+」記号を除く)をすべて削除するだけです。英国では+44 (0) ...、国際プレフィックスを使用するように求められたときに非標準形式で数字を書く傾向があるため、注意してください。(その特定のケースでは、(0)完全に破棄する必要があります)。

次に、次のような値になります。

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

次に、表示するときに、心ゆくまで再フォーマットします。例えば

  1 (234) 567-8901
  1 (234) 567-8901 x1234
311
fatcat1111 2008-09-24 10:32.

これには、少なくとも北米では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+))?$
304
Dave Kirby 2009-08-08 07:24.
.*

ユーザーがあなたに自分の電話番号を教えたいのなら、それを正しくするために彼らを信頼してください。彼らがあなたにそれを与えたくない場合は、彼らに有効な番号を入力させることは、彼らを競合他社のサイトに送るか、あなたの正規表現に合うランダムな文字列を入力させるでしょう。プレミアムレートの星占いホットラインの番号を調べて、代わりに入力したくなるかもしれません。

また、次のいずれかをWebサイトの有効なエントリと見なします。

"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"
180
Tim Groeneveld 2013-03-27 08:13.

また、「libphonenumber」Googleライブラリを確認することをお勧めします。私はそれが正規表現ではないことを知っていますが、それはまさにあなたが望むことをします。

たとえば、次のことを認識します。

15555555555

は可能な番号ですが、有効な番号ではありません。また、米国以外の国もサポートしています。

機能のハイライト:

  • 世界のすべての国/地域の電話番号の解析/フォーマット/検証。
  • getNumberType-番号自体に基づいて番号のタイプを取得します。固定回線、モバイル、フリーダイヤル、プレミアムレート、共有コスト、VoIP、および個人番号(可能な場合はいつでも)を区別できます。
  • isNumberMatch -2つの数値が同じである可能性があるかどうかの信頼水準を取得します。
  • getExampleNumber/ getExampleNumberByType-すべての国/地域に有効なサンプル番号を提供し、必要なサンプル電話番号のタイプを指定するオプションがあります。
  • isPossibleNumber -完全な検証よりもはるかに高速で、長さ情報のみを使用して、番号が可能な電話番号であるかどうかをすばやく推測します。
  • isValidNumber -長さとプレフィックス情報を使用した、地域の電話番号の完全な検証。
  • AsYouTypeFormatter -ユーザーが各桁を入力すると、その場で電話番号をフォーマットします。
  • findNumbers -テキスト入力で数字を検索します。
  • PhoneNumberOfflineGeocoder -電話番号に関連する地理情報を提供します。

電話番号の検証に関する最大の問題は、それが非常に文化的に依存していることです。

  • アメリカ
    • (408) 974–2042有効な米国の番号です
    • (999) 974–2042有効な米国の番号ではありません
  • オーストラリア
    • 0404 999 999ある有効なオーストラリアの数
    • (02) 9999 9999有効なオーストラリアの番号でもあります
    • (09) 9999 9999有効なオーストラリアの番号ではありません

電話番号の形式を確認するには正規表現で十分ですが、実際には電話番号の有効性を確認することはできません。

電話番号をテストするための単純な正規表現をスキップし、Google libphonenumber(GitHubプロジェクトへのリンク)などのライブラリを使用することをお勧めします。

libphonenumberが登場!

より複雑な例の1つを使用すると、(オンラインデモへのリンク)から次のデータ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のコードがありますが、Googlei18nの電話番号データセットを使用する他の言語のライブラリも実装されています。

  • PHP:https://github.com/giggsey/libphonenumber-for-php
  • Python:https://github.com/daviddrysdale/python-phonenumbers
  • ルビー:https://github.com/sstephenson/global_phone
  • C#:https://github.com/twcclegg/libphonenumber-csharp
  • Objective-C:https://github.com/iziz/libPhoneNumber-iOS
  • JavaScript:https://github.com/ruimarinho/google-libphonenumber
  • エリクサー:https://github.com/socialpaymentsbv/ex_phone_number

常に1つのロケールからの番号を受け入れ、常に1つの形式であることが確実でない限り、このために独自のコードを記述せず、電話番号の検証と表示にlibphonenumberを使用することを強くお勧めします。

82
Ismael Miguel 2014-01-08 02:30.

/^(?:(?:\(?(?: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

63
indiv 2008-09-24 11:58.

すべての空白を取り除くという答えはきちんとしていますが、正規表現を見つけるという問題は実際には解決されません。たとえば、Webページをダウンロードし、正規表現を使用してすべての電話番号を抽出するテストスクリプトを考えてみましょう。とにかく正規表現が必要になるので、正規表現にすべての作業を行わせることもできます。私はこれを思いついた:

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

これはそれをテストするためのperlスクリプトです。あなたが一致するとき、$1 contains the area code, $2と $3 contain the phone number, and $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*))?';
46
vapcguy 2014-08-14 16:00.

:私は誰のアイテム、regexsアウトだけ渡す必要はない/必要とする方法をアドレッシングなかったため、このスレッドで答えとして私の答えを含めることを決定する前に、別のSOの質問にこの質問に答え、予期せぬ事を一致、正規表現、間違った作業を

そのサイトへの私の投稿から、自分の希望する電話番号形式の正規表現を作成するのに役立つクイックガイドを作成しました。これは、他のサイトで行ったように、制限が厳しすぎる場合は注意が必要です。希望する結果が得られない可能性があり、世界中で考えられるすべての電話番号を受け入れるための「万能」ソリューションはありません。選択した形式として受け入れることにしたものだけです。自己責任。

クイックチートシート

  • 式を開始します。 /^
  • スペースが必要な場合は、次を使用します:[\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]、77または78が必要です。
  • $/ :式を終了します
31
Artjom Kurapov 2010-02-04 23:52.

私は最も単純に書いた(私はそれにドットを必要としなかったが)。

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

後述するように、構造/順序ではなく、文字のみをチェックします

23
Ben Clifford 2010-03-22 06:32.

()一般的な英国の番号を書くスタイルでは、文字の削除は機能しないことに注意してください。つまり+44 (0) 1234 567890、国際番号をダイヤルするか
+441234567890
、英国のダイヤルを使用します。01234567890

22
Steve 2012-08-16 11:21.

フィールドにランダムなゴミがないことを確認したいだけの場合(つまり、フォームスパマーから)、この正規表現はうまくいくはずです:

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

数字の数やそれらの数字で有効な数字に関する特別な規則はないことに注意してください。数字、括弧、ダッシュ、プラス、スペース、ポンド、アスタリスク、ピリオド、コンマ、または文字のみを検証するだけです。ext存在しています。

国際番号およびローカリゼーション形式と互換性がある必要があります。一部の地域で角かっこ、中かっこ、または角かっこを使用できるようにする必要があると思いますか?(現在、それらは含まれていません)。

1桁あたりのルール(米国の市外局番やプレフィックス(交換コード)は200〜999の範囲内にある必要があります)を維持したい場合は、幸運を祈ります。世界のどの国によっても将来いつでも時代遅れになる可能性のある複雑なルールセットを維持することは、面白く聞こえません。

また、すべて/ほとんどの非数値文字を削除することはサーバー側でうまく機能する可能性がありますが(特に、これらの値をダイヤラーに渡すことを計画している場合)、検証中にユーザーの入力を破棄したくない場合があります。別のフィールドで修正を行います。

15
Rob Wells 2008-09-24 10:19.

RegExLibを見たことがありますか?

米国の電話番号を入力すると、可能性のかなりのリストが戻ってきました。

13
ReactiveRaven 2012-03-10 05:31.

無制限の正規表現での私の試み:

/^[+#*\(\)\[\]]*([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

表示用に消毒するのはあなた次第です。ただし、検証後は数値になる可能性があります。

12
Stuart Kershaw 2015-04-24 12:18.

これは、私が達成する必要のある検証に最も近い素晴らしいパターンです。私は原作者ではありませんが、この問題は非常に複雑で、簡潔で広く役立つ答えがないことがわかったので、共有する価値があると思います。

次の正規表現は、さまざまなグローバル電話番号形式で広く使用されている番号と文字の組み合わせをキャッチします。

/^\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 1416555
9292

ネガティブ:
926 3 4
8800600-APPLE

元のソース: http://www.regexr.com/38pvb

12
Herobrine2Nether 2015-09-12 12:02.

私はこれが非常にうまく機能することを発見しました:

^\(*\+*[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

必ずグローバルANDマルチラインフラグを使用してください。

リンク: http://www.regexr.com/3bp4b

11
ron0 2009-04-11 02:21.

フォームの検証について話している場合、正しい意味と正しいデータを検証する正規表現は、国やプロバイダーの基準が異なるため、非常に複雑になります。また、最新の状態に保つのは難しいでしょう。

私は質問を広く有効なパターンを探していると解釈します。これは内部的に一貫していない可能性があります。たとえば、有効な番号のセットはありますが、国コードプレフィックスの有効なパターンに対する幹線や交換などを検証していません。 。

北米は単純明快であり、国際的には、人々が自分の番号を指定して覚える方法をカバーする「慣用的な」パターンを使用することを好みます。

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

北米のパターンでは、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

私の経験は北米、ヨーロッパ、そしてアジアのほんの一部に限られているため、これは偏っている可能性があります。

10
mindplay.dk 2011-04-15 10:56.

私の直感は、このトピックへの返信の量によって強化されています-この問題には事実上無限の数の解決策があり、どれもエレガントにはなりません。

正直なところ、電話番号を検証しようとしないことをお勧めします。さまざまな正当な形式をすべて許可する大きくて毛むくじゃらのバリデーターを作成できたとしても、そもそも電話番号にリモートで似ているものでもほとんど何でも許可することになります。

私の意見では、最も洗練された解決策は、最小の長さを検証することであり、それ以上のものではありません。

10
GaiusSensei 2012-01-18 15:23.

これは、フィリピンの携帯電話番号の単純な正規表現パターンです。

((\+[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  

最初のものは任意の2桁の国コードに一致し、2番目のものはフィリピンの国コードにのみ一致します。

ここでテストしてください: http://refiddle.com/1ox

9
Nicholas Trandem 2008-09-24 10:14.

これが私のこれまでの最善の試みです。上記のフォーマットを処理しますが、他の可能なフォーマットがいくつか欠けていると確信しています。

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

単一の/単純な正規表現で国際番号を処理するのは難しいでしょう。国際(さらには北米)の電話番号の難しさについては、この投稿を参照してください。

最初の数桁を解析して国コードを判別してから、国に基づいて異なる動作をする必要があります。

それを超えて-あなたが与えたリストは別の一般的な米国のフォーマットを含んでいません-最初の1を省略します。米国のほとんどの携帯電話はそれを必要とせず、国際的にダイヤルしない限り若い世代を困惑させ始めます。

あなたはそれがトリッキーな問題であることを正しく特定しました...

-アダム

7
Drew Thomas 2014-07-09 08:28.

これらの回答を読んだ後、大量のテキストを解析し、任意の形式(プラス記号の有無にかかわらず国際電話を含む)で電話番号を引き出すことができる単純な正規表現がなかったようです。

これが私が最近クライアントプロジェクトに使用したものです。そこでは、任意の形式のすべての電話番号をtel:リンクに変換する必要がありました。

これまでのところ、彼らが投げかけたすべてのもので機能していますが、エラーが発生した場合は、この回答を更新します。

正規表現:

/(\+*\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;
}
6
Jon Ericson 2008-09-24 11:02.

私は信じている番号::電話::米国および正規表現を::一般的な(特にソース正規表現::共通:: URI :: RFC2806)Perlモジュールは助けることができます。

番号を検証する目的を説明するために、質問はおそらくもう少し詳細に指定する必要があります。たとえば、911は米国では有効な数値ですが、911xはxのどの値にも対応していません。これは、電話会社がダイヤルが完了したときに計算できるようにするためです。この問題にはいくつかのバリエーションがあります。しかし、正規表現は市外局番の部分をチェックしないので、それは問題ではないようです。

メールアドレスの検証と同様に、有効な結果が得られたとしても、試してみるまで、誰かに割り当てられているかどうかはわかりません。

ユーザー入力を検証しようとしている場合は、結果を正規化して実行してみませんか?ユーザーが有効な番号として認識できない番号を入力した場合は、入力したとおりに保存するか、使用できない文字を削除してください。番号::電話::ノーマライズPerlモジュールは、インスピレーションの源である可能性があります。

4
Joe Phillips 2008-09-24 10:41.

私は市場調査会社で働いており、これらのタイプの入力を常にフィルタリングする必要があります。あなたはそれを複雑にしすぎています。英数字以外の文字を削除して、拡張子があるかどうかを確認してください。

さらに分析するために、有効な番号のデータベースへのアクセスを提供し、それらが固定電話か携帯電話か、切断されているかなどを通知する多くのプロバイダーの1つにサブスクライブできます。費用がかかります。

4
rooskie 2009-07-22 02:03.

文字のフォーマットを置き換えてから、残りの文字の有効性を確認してください。PHPでは、

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

このような複雑な正規表現を破ることも同様に効果的ですが、はるかに簡単です。

3
Chris 2011-01-05 09:51.

これは面白いものだと思いました。私はそれをテストしていませんが、それはうまくいくように見えます

<?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.';
}
?>
3
Abe Miessler 2011-08-11 19:10.

これには、マスクされた入力を使用したほうがよいでしょう。そうすれば、ユーザーは数字のみを入力でき、適切と思われる方法でフォーマットできます。これがWebアプリケーション用かどうかはわかりませんが、ある場合は、これを行うためのいくつかのオプションを提供する非常にクリックの多いjQueryプラグインがあります。

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

彼らは、チュートリアルで電話番号の入力をマスクする方法についても説明します。

3
Richard Ayotte 2012-05-14 09:47.

これは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
2
piCookie 2008-09-24 12:59.

私の傾向は、数字以外の部分を取り除き、そこにあるものを受け入れることが最善であることに同意することです。たとえば、アルファベットの電話番号「ASK-JAKE」のようなものは禁止されていますが、少なくとも2桁の数字が存在することを確認する必要があります。

いくつかの単純なperl式は次のようになります。

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

最初のものを使用して、数字グループをまとめます。これにより、フォーマットの手がかりが得られる場合があります。2番目のものを使用して、数字以外のすべてを簡単に投げます。

一時停止してからさらにキーを入力する必要があるのではないかと心配ですか?または555-1212(ビープ音を待つ)123のようなものですか?

2
Ian 2011-03-01 13:16.
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

数字で終わる必要があり、(または+または数字で始めることができ、+-(または)を含めることができます

2
Lajos Arpad 2011-08-10 00:36.

アイルランドの携帯電話番号と同様のことをすることに興味がある人のために、これを達成する簡単な方法があります:

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._-][email protected][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();
});


});

ソース。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

フィリップス40インチ4Kカーブモニターレビュー:ゴーストをあきらめる

フィリップス40インチ4Kカーブモニターレビュー:ゴーストをあきらめる

フィリップスのBDM4037UWは、最大4つのフルHD入力を同時に表示できる40インチのウルトラHD曲面LCDモニターであり、マルチプラットフォームゲーマーに最適な大型モニターのようです。そして、それは、2、3の小さな失敗と1つの大きなつまずきがなければ、そうなるでしょう。

アトランタは2018年まで戻ってきませんが、ドナルドグローバーはFX用のテレビをもっと作っています

アトランタは2018年まで戻ってきませんが、ドナルドグローバーはFX用のテレビをもっと作っています

(写真:Rodin Eckenroth / Getty Images)良いニュースと悪いニュースがあります。前者?FXは本日、ドナルドグローバーがFXプロダクションと独占的な全体的な制作契約を結んだことを発表しました。つまり、グローバーからのより多くの番組がFXや他の場所で行われることを意味します。

スクリームクイーンズは、いくつかの「ゴーストストーリー」で地獄のようにメタを取得します

スクリームクイーンズは、いくつかの「ゴーストストーリー」で地獄のようにメタを取得します

ライアン・マーフィーのように、毎ターンショーランナーのIDについて多くを学ぶことはめったにありません。その奇妙なことは、特定の瞬間にライアンマーフィーの工芸品について言えることのすべてですが、彼がグリーの特徴を使ってスピンザボトルをプレイしている場合でも、アメリカンホラーストーリーの壁で衝撃画像のスパゲッティを投げている場合でも、それは光ります。

イーロンマスクは、Twitterのフィードバックに基づいてテスラの車に基本的な機能を追加し続けています

イーロンマスクは、Twitterのフィードバックに基づいてテスラの車に基本的な機能を追加し続けています

自動車のパイオニアでありテスラのCEOであるイーロンマスクは、ツイッターでのテスラの所有者のフィードバックに応えて、今週末に多くの時間を費やしました。フィードバックは建設的であり、すぐにより良い車になる可能性がありますが、フォーラムでは急速に成長している自動車メーカーのカスタマーサービスの問題に焦点を当てています。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language