電話番号を検証するための包括的な正規表現をまとめようとしています。理想的には、国際形式を処理できますが、次のような米国の形式を処理する必要があります。
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
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
私は現在の試みで答えますが、誰かがより良いものやよりエレガントなものを持っていることを願っています.
+44 (0) ...
より良いオプション...入力時に数字以外のすべての文字を削除するだけです(「x」と先頭の「+」記号を除く)。英国では国際接頭辞の使用を求められたときに非標準形式で数字を書く傾向があるため注意してください(その特定のケースでは、(0)
完全に破棄する必要があります)。
次に、次のような値になります。
12345678901
12345678901x1234
345678901x1234
12344678901
12345678901
12345678901
12345678901
+4112345678
+441234567890
その後、表示するときは、心ゆくまで再フォーマットしてください。例えば
1 (234) 567-8901
1 (234) 567-8901 x1234
これには、少なくとも北米では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+))?$
.*
ユーザーがあなたに自分の電話番号を教えたいのなら、それを正しく理解するために彼らを信頼してください。彼らがあなたにそれを与えたくない場合は、有効な番号を入力するように強制すると、競合他社のサイトに送信されるか、正規表現に適合するランダムな文字列を入力するようになります。プレミアムレートの星占いホットラインの番号を調べて、代わりに入力したくなるかもしれません。
また、次のいずれかを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"
また、「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 プロジェクトへのリンク)などのライブラリを使用することをお勧めします。
より複雑な例の 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 のコードがありますが、Google i18n 電話番号データセットを使用する他の言語のライブラリも実装されています。
常に 1 つのロケールから番号を受け入れ、常に 1 つの形式であることが確実でない限り、このために独自のコードを作成するのではなく、電話番号の検証と表示に 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 では、以下を保存します。
https://regex101.com/r/kFzb1s/1でテストできます
すべての空白を取り除く答えはきちんとしていますが、正規表現を見つけるという問題が実際に解決されるわけではありません。たとえば、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*))?';
私は別のSOの質問でこの質問に答えましたが、このスレッドの回答として私の回答を含めることを決定する前に、アイテムを要求する/要求しない方法に誰も対処していなかったため、正規表現を配布しただけです:正規表現が 正しく機能せず、予期しないものに一致する
そのサイトの私の投稿から、私は誰でも自分の希望する電話番号形式の独自の正規表現を作成するのを支援するためのクイックガイドを作成しました.希望する結果が得られない可能性があり、世界中の可能なすべての電話番号を受け入れるための「万能」ソリューションはありません。選択した形式として受け入れると決めたものだけです。自己責任。
/^
[\s]
または\s
[(]
し[)]
ます。\(
and の使用\)
は見苦しく、混乱を招く可能性があります。?
その後に-
またはを入力し[-]
ます。ただし、一連の他の文字の最初または最後に配置しない場合は、エスケープする必要がある場合があります。 \-
[-.\s]
ハイフン、ピリオド、またはスペースが必要です。最後の括弧の後に疑問符を付けると、そのスロットのすべてがオプションになります。\d{3}
: 000 ~ 999 の 3 桁の数字が必要です。の省略形
[0-9][0-9][0-9]
。[2-9]
: そのスロットには 2 ~ 9 の数字が必要です。(\+|1\s)?
: 「プラス」または 1 とスペース (パイプ文字、,|
は「または」) を受け入れ、オプションにします。「プラス」記号はエスケープする必要があります。[246]
、または 6 が必要です。(?:77|78)
または[77|78]
、77 または 78 が必要です。$/
: 表現を終了する私は最も簡単に書きました(ドットは必要ありませんでしたが)。
^([0-9\(\)\/\+ \-]*)$
以下で説明するように、構造/順序ではなく、文字のみをチェックします
()
文字の削除は、一般的な英国の番号の書き方では機能しないことに注意してください。つまり+44 (0) 1234 567890
、国際番号
+441234567890
または英国のダイヤルでダイヤルすることを意味します。01234567890
フィールドにランダムなガベージがないことを確認したいだけの場合 (つまり、フォームスパマーから)、この正規表現はうまくいくはずです:
^[0-9+\(\)#\.\s\/ext-]+$
桁数、またはそれらの桁で有効な数字について特別なルールがないことに注意してください。数字、括弧、ダッシュ、プラス、スペース、ポンド、アスタリスク、ピリオド、コンマ、または文字のみを検証するだけです。e
、x
、t
が存在します。
国際番号およびローカリゼーション形式と互換性がある必要があります。一部の地域では、角かっこ、中かっこ、または角かっこを許可する必要があると予測していますか? (現在は含まれていません)。
桁ごとの規則 (米国の市外局番やプレフィックス (交換コード) は 200 ~ 999 の範囲に収まる必要があるなど) を維持したい場合は、頑張ってください。世界のどの国でも、将来のどの時点でも時代遅れになる可能性のある複雑なルールセットを維持することは、面白くありません。
すべて/ほとんどの非数値文字の削除はサーバー側ではうまくいくかもしれませんが (特に、これらの値をダイヤラに渡すことを計画している場合)、検証中にユーザーの入力をスラッシングしたくない場合があります。別のフィールドで修正を行います。
RegExLibを調べましたか?
米国の電話番号を入力すると、可能性のかなりのリストが返されました。
これは、私が達成する必要のある検証に最もよく一致する素晴らしいパターンです。私は元の著者ではありませんが、この問題は非常に複雑であり、簡潔で広く役立つ答えがないことがわかったので、共有する価値があると思います.
次の正規表現は、さまざまなグローバルな電話番号形式で広く使用されている数字と文字の組み合わせを検出します。
/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm
Positive:
+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-APPLE
元のソース: http://www.regexr.com/38pvb
無制限の正規表現での私の試み:
/^[+#*\(\)\[\]]*([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
展示用に消毒するのはあなた次第です。ただし、検証後は数値になる可能性があります。
これまでのところ、私の最善の試みです。上記の形式を処理しますが、他の可能な形式が欠落していると確信しています。
^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
フォームの検証について話している場合、正しい意味と正しいデータを検証するための正規表現は、国やプロバイダーの基準が異なるため、非常に複雑になります。また、最新の状態に保つことも困難になります。
私は質問を、内部的に一貫していない可能性がある広く有効なパターンを探していると解釈します。 .
北米は単純明快で、国際的な場合は、人々が自分の番号を指定して覚える方法をカバーする「慣用的な」パターンを使用することを好みます。
^((((\(\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
私の経験は北米、ヨーロッパ、そしてアジアの一部に限られているため、これは偏っている可能性があります.
これは、フィリピンの携帯電話番号の単純な正規表現パターンです。
((\+[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
私の直感は、このトピックへの返信の量によって強化されます。この問題には事実上無限の数の解決策があり、そのどれもが洗練されたものではないということです。
正直なところ、電話番号を検証しようとしないことをお勧めします。さまざまな正当なフォーマットをすべて許可する巨大で毛むくじゃらのバリデーターを作成できたとしても、そもそも電話番号に少し似ているものであっても、ほとんどすべてを許可することになります。
私の意見では、最も洗練された解決策は最小の長さを検証することであり、それ以上のものではありません。
単一または単純な正規表現で国際電話番号を処理するのは難しいでしょう。国際 (および北アメリカの) 電話番号の難しさに関するこの投稿を参照してください。
最初の数桁を解析して国コードが何であるかを判断し、国に基づいて異なる動作をする必要があります。
それを超えて-あなたが提供したリストには、別の一般的な米国の形式が含まれていません-最初の1を省略します.米国のほとんどの携帯電話はそれを必要とせず、国際的にダイヤルしない限り、若い世代を困惑させ始めます.
あなたはそれがトリッキーな問題であることを正しく認識しています...
-アダム
これらの回答を読んだ後、一連のテキストを解析して任意の形式 (プラス記号の有無にかかわらず国際を含む) の電話番号を抽出できる単純な正規表現がないように見えます。
これは私が最近クライアント プロジェクトに使用したもので、すべての電話番号を任意の形式で 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;
}
Number::Phone::USとRegexp::Common (特にRegexp::Common::URI::RFC2806のソース) Perl モジュールが役立つと思います。
数値を検証する目的を説明するために、質問をもう少し詳しく指定する必要があります。たとえば、911 は米国では有効な番号ですが、911x は x の値には対応していません。これは、電話会社がいつダイヤルを終了したかを計算できるようにするためです。この問題にはいくつかのバリエーションがあります。ただし、正規表現は市外局番の部分をチェックしないため、問題にはならないようです。
電子メール アドレスの検証と同様に、有効な結果が得られたとしても、それが誰かに割り当てられているかどうかは、試してみるまでわかりません。
ユーザー入力を検証しようとしている場合は、結果を正規化して処理してみませんか? ユーザーが有効な番号として認識できない番号を入力した場合は、入力した番号として保存するか、入力できない文字を取り除きます。Number::Phone::Normalize 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 );
このような複雑な正規表現を破ることも同様に効果的ですが、はるかに簡単です。
私は市場調査会社で働いており、これらの種類の入力を常にフィルタリングする必要があります。あなたはそれを複雑にしすぎています。英数字以外の文字を取り除き、拡張子があるかどうかを確認してください。
さらに分析するために、有効な番号のデータベースへのアクセスを提供し、それらが固定電話か携帯電話か、切断されているかなどを知らせる多くのプロバイダーのいずれかに加入できます。費用がかかります。
これは面白いものだと思いました。私はそれをテストしていませんが、それはうまくいくように見えます
<?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.';
}
?>
私は同じ問題に苦しんでおり、アプリケーションを将来の証明にしようとしていましたが、これらの人は私を正しい方向に導いてくれました. 私は実際に番号自体をチェックして、それが機能するかどうかを確認しているのではなく、内線番号がある場合とない場合がある一連の番号が入力されていることを確認しようとしているだけです。
最悪の場合、ユーザーが XML ファイルからフォーマットされていない番号を取得する必要があった場合でも、電話のテンキー012345678x5
に番号を入力するだけで、きれいにしておく理由はありません。そのような正規表現は、私にとっては次のようになります。
\d+ ?\w{0,9} ?\d+
01234467 extension 123456
01234567x123456
01234567890
これは、JavaScript でうまく機能するものです。これは、Dojo ウィジェットが予期していたものであるため、文字列になっています。
これは、10 桁の北米 NANP 番号とオプションの内線番号に一致します。スペース、ダッシュ、およびピリオドを区切り文字として使用できます。
"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
これには、Masked Input を使用した方がよいでしょう。そうすれば、ユーザーは数字のみを入力でき、適切と思われる書式を設定できます。これがWebアプリケーション用かどうかはわかりませんが、そうであれば、これを行うためのいくつかのオプションを提供する非常にクリックのjQueryプラグインがあります.
http://digitalbush.com/projects/masked-input-plugin/
チュートリアルでは、電話番号の入力をマスクする方法についても説明しています。
pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$"
validateat="onsubmit"
数字で終わる必要があり、(または+または数字で始めることができ、+-(または)を含めることができます
アイルランドの携帯電話番号で同様のことを行うことに興味がある人は、それを達成するための簡単な方法を次に示します。
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();
});
});
ソース。
私の傾向は、数字以外を取り除き、そこにあるものを受け入れるのが最善であることに同意することです. たぶん、少なくとも数桁が存在することを確認するためですが、たとえば、アルファベットの電話番号「ASK-JAKE」などは禁止されています.
いくつかの単純な perl 式は次のようになります。
@f = /(\d+)/g;
tr/0-9//dc;
最初のものを使用して数字グループをまとめます。これにより、フォーマットの手がかりが得られる場合があります。2番目のものを使用して、数字以外のすべてを簡単に投げます。
一時停止してからさらにキーを入力する必要があるかもしれないという心配はありますか? または、555-1212 (ビープ音を待ちます) 123 のようなものですか?
これに正規表現を使用することはお勧めしません。
'x'
一番上の答えのように、電話番号からすべての醜さを取り除き、拡張子が提供されている場合は、数字の文字列が残るようにします。
Pythonの場合:
注:Web上で取得できるテキストファイル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
これはかなりカバーしています。これは正規表現ではありませんが、他の言語に非常に簡単にマップできます。
トルコの実例、変更するだけ
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!';
}
単純な正規表現を使用してあらゆる種類の国際電話番号を処理することはほとんど不可能です。
numverify.comのようなサービスを使用する方がよいでしょう。彼らは国際電話番号検証用の無料の JSON API を提供しています。さらに、すべてのリクエストで国、場所、キャリア、および回線の種類に関する有用な詳細を取得できます。
可能であれば、市外局番、3 桁のプレフィックス、4 桁の部分、内線番号の 4 つの個別のフィールドを用意することをお勧めします。これにより、ユーザーは住所の各部分を個別に入力でき、各部分を個別に確認できます。こうすることで、検証がはるかに簡単になるだけでなく、電話番号をより一貫した形式でデータベースに保存できます。
電話番号を書くには非常に多くのオプションがあるため、どのように区切られていても、十分な数字が含まれているかどうかをテストできます。私は9から14桁がうまくいくことを発見しました:
^\D*(\d\D*){9,14}$
真実:
間違い:
これらの最後の 2 つの例をサポートしたい場合は、上限を削除してください。
(\d\D*){9,}
(^$
上限がない場合は不要)
/\b(\d{3}[^\d]{0,2}\d{3}[^\d]{0,2}\d{4})\b/