web-dev-qa-db-ja.com

電話番号検証のための包含的な正規表現

電話番号を検証するための包括的な正規表現をまとめようとしています。理想的にはそれは国際的なフォーマットを扱うでしょうが、それは以下を含む米国のフォーマットを扱わなければなりません:

  • 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

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

870

より良いオプション...国際化を使用するよう要求されたときに非標準形式+44 (0) ...で数字を書くというイギリスの傾向のために注意して、単に入力上のすべての非数字文字を削除する接頭辞(その特定のケースでは、あなたは(0)を完全に捨てるべきです)。

それでは、次のような値になります。

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

それからあなたが表示するとき、あなたの心の内容に再フォーマットします。例えば.

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

少なくとも北米では、 _ nanp _ と呼ばれるものがあります。

あなたが望むものを正確に指定する必要があります。有効な区切り文字は何ですか?スペース、ダッシュ、ピリオド区切り文字は使えませんか? 1つの区切り文字を混在させることはできますか(たとえば、+ 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+))?$
288
Justin R.
.*

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

私はまたウェブサイトの有効な記入項目として次のどれかを考慮するでしょう:

"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"
286
Dave Kirby

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

たとえば、次のように認識されます。

15555555555

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

機能のハイライト:

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

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

  • アメリカ
    • (408) 974–2042 有効な US番号です
    • (999) 974–2042 無効な US番号です
  • オーストラリア
    • 0404 999 999 有効な オーストラリアの番号です
    • (02) 9999 9999 valid オーストラリアの番号でもあります
    • (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

グーグルのバージョンはジャバとジャバスクリプトのためのコードを持っています、しかし人々はグーグル国際電話番号データセットを使う他の言語のためのライブラリも実装しました:

常に1つのロケールから数字を受け取ることが確実であり、それらが常に1つのフォーマットになることを確信している場合を除き、このために独自のコードを書かず、電話番号の検証と表示にlibphonenumberを使用することを強くお勧めします。

151
Halfwarr

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

70
Ismael Miguel

すべての空白を取り除くという答えはきちんとしていますが、提起された問題、つまり正規表現を見つけることを実際には解決しません。たとえば、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に市外局番、$ 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*))?';
63
indiv

他のSO質問でこの質問に回答しました。このスレッドの回答として自分の回答も含めることを決定しました。これは、正規表現を配るだけで、アイテムを要求する/要求しない方法に対処している人がいないためです: 正規表現が正しく動作せず、予期しないものに一致する

そのサイトでの私の投稿から、私は誰もが自分の希望する電話番号形式の正規表現を作成するのを助けるクイックガイドを作成しました。希望する結果が得られない可能性があります。また、世界中のすべての電話番号を受け入れる「ワンサイズフィット」ソリューションはありません。選択した形式として受け入れることに決めたものだけです。自己責任。

クイックチートシート

  • 式を開始します:/^
  • スペースが必要な場合は、[\s]または\sを使用します
  • 括弧を必要とする場合は、[(]および[)]を使用します。 \(\)の使用はisいため、混乱を招く可能性があります。
  • 何かをオプションにしたい場合は、その後に?を付けてください
  • ハイフンが必要な場合は、-または[-]と入力するだけです。ただし、他の一連の文字の最初または最後に配置しない場合は、エスケープする必要があります。\-
  • スロットでさまざまな選択肢を受け入れる場合は、オプションをブラケットで囲みます。[-.\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が必要です。
  • $/:式を終了します
41
vapcguy

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

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

後述するように、それは文字だけをチェックし、その構造/順序はチェックしません

28
Artjom Kurapov

()文字の除去は、一般的な英国番号の記述スタイルでは機能しないことに注意してください。+44 (0) 1234 567890は、国際番号をダイヤルすることを意味します。
+441234567890
または英国の場合は01234567890をダイヤルします

22
Ben Clifford

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

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

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

それは国際的な番号と地域化フォーマットと互換性があるべきです。一部の地域では、角かっこ、角かっこ、または角かっこを使用できるようにする必要がありますか。 (現在は含まれていません)。

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

また、すべての/ほとんどの数字以外の文字を削除するとサーバー側ではうまくいく場合がありますが(特にこれらの値をダイヤラに渡す予定がある場合)、検証時にユーザーの入力をスラッシュしたくない場合があります。別のフィールドで修正してください。

21
Steve

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

米国の電話番号を入力すると、非常に多くの可能性があります。

14
Rob Wells

私はこれが非常にうまくいくことがわかりました:

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

12

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

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

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

私はこの質問を、内部的に一貫していないかもしれない、広く有効なパターンを探していると解釈します。例えば、有効な数字のセットを持っていますが。

北アメリカは簡単です、そして国際的には、私は人々が彼らの数を指定して覚える方法をカバーする「慣用的な」パターンを使うのを好みます:

^((((\(\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

私の経験は北アメリカ、ヨーロッパ、そしてほんの少しのアジアに限られているので、これは偏っているかもしれません。

11
ron0

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

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

10
GaiusSensei

私の直感は、このトピックに対する回答の数によって補強されています - この問題に対する解決策は事実上無限にありますが、どれもエレガントにはならないでしょう。

正直なところ、電話番号を検証しないでください。たとえあなたがすべての異なった合法的なフォーマットを許すであろう大きくて毛深いバリデータを書くことができたとしても、それは結局遠隔地でさえ電話番号に似ていることさえほとんど何でも許すことになるでしょう。

私の意見では、最も洗練された解決策は最小の長さを検証することです。

10
mindplay.dk

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

以下の正規表現は、さまざまな世界的な電話番号フォーマットで広く使われている数字と文字の組み合わせを捉えます。

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

9
Stuart Kershaw

単一の/単純な正規表現で国際電話番号を扱うのは難しいでしょう。 この記事 国際電話番号(そして北米でさえ)の電話番号の難しさについて。

最初の数桁を解析して国コードが何であるかを判断してから、国に応じて異なる方法で行動します。

それを超えて - あなたが与えたリストはもう一つの一般的な米国のフォーマットを含んでいない - 最初の1を除いて。

あなたはそれが難しい問題であることを正しく識別しました...

-アダム

9
Adam Davis

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

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

これらの答えを読んでみると、たくさんのテキストを解析して任意の形式の電話番号を引き出すことができる単純な正規表現はありませんでした(プラス記号の有無にかかわらず国際を含む)。

これが私が最近クライアントプロジェクトで使用したものです、そこで私たちはあらゆるフォーマットのすべての電話番号を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;
}
8
Drew Thomas

私は Number :: Phone :: USRegexp :: Common (特に Regexp :: Common :: URI :: RFC2806 のソース)のPerlモジュールが役に立つと信じています。

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

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

ユーザー入力を検証しようとしているのであれば、結果を正規化して実行しないでください。ユーザーが数字を入力した場合、有効な数字として認識できない場合は、入力したものとして保存するか、または使用できない文字を削除します。 Number :: Phone :: Normalize Perlモジュールはインスピレーションの源になるかもしれません。

6
Jon Ericson

私はマーケットリサーチ会社で働いています、そして、私たちはこれらのタイプの入力をいつでもフィルタリングしなければなりません。あなたはそれを複雑にしすぎています。英数字以外の文字を取り除き、拡張子があるかどうかを確認してください。

さらに分析するには、有効な番号のデータベースにアクセスできるようにするだけでなく、固定電話か携帯電話か、切断されているかどうかなどを通知する、多数のプロバイダの1つに加入できます。

4
Joe Phillips

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

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

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

4
rooskie

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

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

彼らは彼らのチュートリアルでどのように電話番号入力を隠すかについても調べます。

3
Abe Miessler

私は自分のアプリケーションの将来性を証明しようとしているのと同じ問題に苦しんでいましたが、これらの人たちは私を正しい方向に導きました。実際に番号自体を調べて機能しているかどうかを確認するのではなく、内線番号の有無にかかわらず一連の番号が入力されていることを確認しようとしています。

ユーザーがXMLファイルからフォーマットされていない番号を取得する必要がある場合の最悪のシナリオでは、電話の番号パッド012345678x5に番号を入力するだけでよく、それをきれいに保つ本当の理由はありません。そのようなRegExは、私にとっては次のようなものになるでしょう。

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

これはJavaScriptでうまく機能するものです。 Dojoウィジェットが期待していたものだからです。

これは、オプションの内線番号を持つ10桁の北米NANP番号と一致します。スペース、ダッシュ、ピリオドは区切り文字として使用できます。

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

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

<?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
Chris

私の傾向は、数字以外のものを取り除き、そこにあるものを受け入れることが最善であるということに同意することです。少なくとも2桁の数字があることを保証するために、おそらくそれはアルファベットの電話番号「ASK-JAKE」のような何かを禁止しますが。

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

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

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

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

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

数字で終わらなければならず、(または+または数字で始めることができ、+ - (または)を含めることができます

2
Ian

アイルランドの携帯電話番号と同じようなことをすることに興味がある人のために、これを達成するための簡単な方法は次のとおりです。

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


});

ソース

2
Bob-ob

この記事には言語タグがないので、pythonで使用されるregexソリューションを提供します。

式そのもの:

1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+

Python内で使用された場合:

import re

phonelist ="1-234-567-8901,1-234-567-8901 1234,1-234-567-8901 1234,1 (234) 567-8901,1.234.567.8901,1/234/567/8901,12345678901"

phonenumber = '\n'.join([phone for phone in re.findall(r'1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+' ,phonelist)])
print(phonenumber)

出力:

1-234-567-8901
1-234-567-8901 1234
1-234-567-8901 1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1
SIM

これには正規表現を使用することをお勧めしません。

一番上の答えと同じように、電話番号からすべての醜さを取り除き、拡張子が提供されている場合は'x'を付けた数字の文字列を残すようにします。

Pythonでは:

注:BAD_AREA_CODESテキストファイル - から来ています あなたがウェブ上でつかむことができます。

BAD_AREA_CODES = open('badareacodes.txt', 'r').read().split('\n')

def is_valid_phone(phone_number, country_code='US'):
    """for now, only US codes are handled"""
    if country_code:
        country_code = country_code.upper()

    #drop everything except 0-9 and 'x'
    phone_number = filter(lambda n: n.isdigit() or n == 'x', phone_number)

    ext = None
    check_ext = phone_number.split('x')
    if len(check_ext) > 1:
        #there's an extension. Check for errors.
        if len(check_ext) > 2:
            return False
        phone_number, ext = check_ext

    #we only accept 10 digit phone numbers.
    if len(phone_number) == 11 and phone_number[0] == '1':
        #international code
        phone_number = phone_number[1:]
    if len(phone_number) != 10:
        return False

    #area_code: XXXxxxxxxx 
    #head:      xxxXXXxxxx
    #tail:      xxxxxxXXXX
    area_code = phone_number[ :3]
    head      = phone_number[3:6]
    tail      = phone_number[6: ]

    if area_code in BAD_AREA_CODES:
        return False
    if head[0] == '1':
        return False
    if head[1:] == '11':
        return False

    #any other ideas?
    return True

これはかなりカバーしています。正規表現ではありませんが、他の言語へのマッピングは非常に簡単です。

1
Droogans

アドレスの各部分を別々に入力できるように、表示用に4つの別々のフィールド(市外局番、3桁の接頭部、4桁の部分、内線番号)を用意し、それぞれを個別に確認することはできますか?そうすることで、確認がはるかに簡単になるだけでなく、電話番号をより一貫した形式でデータベースに保存できます。

1
Kibbee

String regex = "^\\+(?:[0-9] ?){6,14}[0-9]$";を探す

国際電話番号に役立ちます。

1
Sai prateek

単純な正規表現を使用してあらゆる種類の国際電話番号を処理することは不可能に近いです。

numverify.comのようなサービスを使うほうがよいでしょう。彼らは国際電話番号の検証のための無料のJSON APIを提供しています。すべての要求とのキャリア、キャリアおよびラインタイプ。

1
Frank

トルコの作業例では、

d{9}

あなたの必要性に従ってそしてそれを使い始めなさい。

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}
1
Sinan Eldem

これを試してみてください(インドの携帯電話番号の検証用です)。

if (!phoneNumber.matches("^[6-9]\\d{9}$")) {
  return false;
} else {
  return true;
}
0
Shylendra Madda

入力として任意の形式の米国の携帯電話番号を受け取り、オプションで2番目のパラメータを受け入れます。提供された番号が携帯電話番号でない場合は、単純にfalseを返します。携帯電話番号ISが検出された場合は、trueではなくサニタイズされた番号全体が返されます。

    function isValidMobile(num,format) {
        if (!format) format=false
        var m1 = /^(\W|^)[(]{0,1}\d{3}[)]{0,1}[.]{0,1}[\s-]{0,1}\d{3}[\s-]{0,1}[\s.]{0,1}\d{4}(\W|$)/
        if(!m1.test(num)) {
           return false
        }
        num = num.replace(/ /g,'').replace(/\./g,'').replace(/-/g,'').replace(/\(/g,'').replace(/\)/g,'').replace(/\[/g,'').replace(/\]/g,'').replace(/\+/g,'').replace(/\~/g,'').replace(/\{/g,'').replace(/\*/g,'').replace(/\}/g,'')
        if ((num.length < 10) || (num.length > 11) || (num.substring(0,1)=='0') || (num.substring(1,1)=='0') || ((num.length==10)&&(num.substring(0,1)=='1'))||((num.length==11)&&(num.substring(0,1)!='1'))) return false;
        num = (num.length == 11) ? num : ('1' + num);   
        if ((num.length == 11) && (num.substring(0,1) == "1")) {
            if (format===true) {
               return '(' + num.substr(1,3) + ') ' + num.substr(4,3) + '-' + num.substr(7,4)
            } else {
               return num
            }
        } else {
            return false;
        }
    }
0
Gautam Sharma