JavaScriptで電話番号を検証する


143

私はこのコードをいくつかのウェブサイトで見つけました、そしてそれは完全に動作します。電話番号が次のいずれかの形式であることを検証します:
(123)456-7890または123-456-7890

問題は、私のクライアント(なぜか、おそらくクライアントのもの)が、次のような別の形式(10個の数字を連続して追加したい)を望んでいることです:1234567890

この正規表現を使用していますが、

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

別の形式も検証することをどのように追加できますか?正規表現が苦手です。



5
経験則として、電話番号を検証しようとすると失敗する運命にあります。さまざまな国や拡張機能のさまざまな構造では、これは非常に難しい問題です。
Quentin

1
そして、例えばフランスの表記についてはどうですか?"12 34 56 78 90"数字以外のすべてを削除し(最初のプラス記号を除く)、長さを確認します。
thejh

あなたはいけません、実際には、正規表現を使用して適切に電話番号を検証します
Dan Dascalescu、2014

回答:


122

まず、フォーマットバリデーターは明らかにNANP(国コード+1)番号にのみ適しています。あなたのアプリケーションは、北米以外からの電話番号を持つ誰かによって使用されますか?もしそうなら、あなたはそれらの人々が完全に有効な[国際]番号を入力することを妨げたくありません。

次に、検証が正しくありません。NANP番号は形取るの数字2-9で、数字0-9です。さらに、市外の市外局番(800、888、877、866、855、900)の番号が交換される場合を除いて、特別なサービスとの混乱を避けるために、市外局番と交換は(2つで終わる)形式をとらない場合があります。NXX NXX XXXXNXN11N11

そのため、有効な電話番号ではありませんが、正規表現は番号(123)123 4566を渡します。あなたは置き換えることによって、これを修正することができます\d{3}[2-9]{1}\d{2}

最後に、Webブラウザーでのユーザー入力を検証しているように感じます。クライアント側の検証は、ユーザーに提供する便利さだけであることに注意してください。サーバー上のすべての入力を(再度)検証する必要があります。

TL; DRは、電話番号URL などの実際の複雑なデータ検証するために正規表現を使用しません。専用ライブラリを使用してください。


電話番号計画は実際には範囲に基づいて機能するため、正規表現では電話番号を検証するのに十分ではないことに同意します。たとえば、12300000から12399999(numberingplans.com/…

146

私の選択した正規表現は:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

有効なフォーマット:

(123)456-7890
(123)456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725


3
/ imとは何ですか?グーグルで説明を見つけることができません:)
Sarin Suriyakoon

7
@SarinSuriyakoon iは式の大文字と小文字を区別せずm、複数行の検索を実行します
Rodrigo Leite

44
なぜ数字の大文字と小文字を区別しないのですか?
ソロモンクロッソン2018

1
あなたが削除する場合ので、この正規表現は素晴らしいです^最初と$最後には、文字列の途中で電話番号を見つけることができるだけでなく
hobberwickey

2
@darioxlz '123456789'は電話番号として有効な長さではありません
punjabi4life

67

10桁のみを検索する場合は、数字以外は無視してください。

   return value.match(/\d/g).length===10;

これは私が提案しようとしていたことです。簡単な。検証が多すぎると、とにかく悪いことになります。
mwilcox

1
これが最善の方法です。あなたが本当にそれがどのフォーマットにあるか気にしない限り、これはすべて、数字が部分的に有効であり、ばかげたものではないことを確認することです。
mdance

7
あなたはマッチ(/ \ d / g)がマッチしない(/ \ d /)か、または長さが10ではなく1になることを意味します。また、空の文字列に対する一致はnullです。少なくとも、var m = value.match(/ \ d / g);である必要があります。return m && m.length === 10
Doug

またはreturn (value.match(/\d/g) || []).length == 10、はるかに単純です(ただし、同じように欠陥があります)return value.replace(/\D/g,'').length == 10
RobG 2016

私はこれが好きです/\D/gi.test(value)。空白、ダッシュなど、数字以外のすべてのもの
Gus

33

私がやろうとしていることは、形式を無視して数値の内容を検証することです。

var originalPhoneNumber = "415-555-1212";

function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}

書式設定を無視することに同意します。たとえば、XXXX XXX XXXのようなスペースを携帯電話番号に表示することは非常に一般的ですが、フォームにはスペースなしの入力を要求する、つまりXXXXXXXXXXのようにします。
RobG 2018年

30
/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123)456-7890
+(123)456-7890
+(123)-456-7890
+(123)-456-7890
+(123)-456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

これは非常に緩いオプションであり、私はこの方法を維持することを好みます。主に、ユーザーが電話番号を追加する必要がある登録フォームで使用します。通常、ユーザーは、厳密なフォーマットルールを適用するフォームに問題があります。私は、ユーザーが数字を入力し、それをディスプレイに表示するか、データベースに保存する前に入力することをお勧めします。 http://regexr.com/3c53v


3
たとえば+41 (79) 123 45 67(スイス)を許可するようにわずかに変更された正規表現:/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g
レミギウススターダー

これはあまりにも文字列ではなく、すべての国際的な形式をカバーしているようです(そしてスイスの修正に@RemigiusStalderをありがとう)
Gavin

Javaバックエンドを使用している場合は、たとえばgithub.com/google/libphonenumber
Remigius Stalder

29

次のREGEXは、これらの形式のいずれかを検証します。

(123)456-7890
123-456-7890
123.456.7890
1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/

3
エスケープする必要があり.ます。そうしないと、任意の文字に一致し、正規表現が壊れます。
クリストフ

1
これは私を正しい方向に導きました。ありがとう!残念ながら、この式は(1234567890および123)4567890にも一致します。^((([0-9] {3}))|([0-9] {3}))[-\ s \。]?[0-9] {3} [-\ s \。]? [0-9] {4} $はその小さな問題を処理します。
Joe Hawkins

15

より明確なものを使用することをお勧めします(特に、誰がコードを保守する必要があるかを考えます)...

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

正規表現は明確なテンプレートから構築されていますか?その場合、新しいものを追加することは非常に簡単で、顧客自身も「オプション」ページでそれを行うことができるかもしれません。


15

strは次のformartsのいずれかです:555-555-5555 (555)555-5555(555)555-5555 555 555 5555 5555555555 1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");


いい正規表現、それがこの質問の最良の答えです
JoelBonetR

9

これを試してください-国際フォーマットの検証も含まれています。

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

この正規表現は、次の形式を検証します。

  • (541)754-3010国内
  • + 1-541-754-3010国際
  • 1-541-754-3010米国でダイヤル
  • 001-541-754-3010ドイツからダイヤル
  • 191 541 754 3010フランスからダイヤル

6

/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/

この投稿は古いですが、私の貢献を残したいのですが。これらは受け入れられます:5555555555 555-555-5555 (555)555-5555 1(555)555-5555 1 555 555 5555 1 555-555-5555 1(555)555-5555

これらは受け入れられません:

555-5555->この使用を受け入れるには: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

5555555->この使用を受け入れるには: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

1 555)555-5555 123 **&!! asdf#55555555(6505552368)2(757)622-7382 0(757)622-7382 -1(757)622-7382 2 757 622-7382 10(757)622 -7382 27576227382(275)76227382 2(757)6227382 2(757)622-7382(555)5(55?)-5555

これは私が使用したコードです:

function telephoneCheck(str) {
  var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
  return patt.test(str);
}

telephoneCheck("+1 555-555-5555");

この正規表現の唯一の問題は、 ')'または '('が1つだけの電話文字列( "(555-555-5555"など)が有効であると見なされることです
happyZZR1400

5

これは動作します:

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

?前のグループが0または1回一致しなければならない文字を意味します。グループは、(-|\s)どちらかのAマッチする-か、|文字を。?正規表現でこのグループが2回出現した後に追加すると、連続する10桁の数字を照合できます。



2

みんなの答えは素晴らしいですが、これはもう少し包括的だと思うものです...

これは、1行で1つの数値をJavaScriptで一致させるために記述されています。

^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$

単語の境界で一致させたい場合は、^と$を\ bに変更するだけです

このソリューションの提案、修正、または批判は歓迎します。私の知る限り、これはNANP形式に一致し(米国の番号の場合-これを作成するときに他の北アメリカの国を​​検証しませんでした)、911エラー(エリアコードまたは地域コードにはない)を回避し、排除します実際に無効な555の番号のみ(555の地域コードの後に​​01xxが続き、x =任意の番号)


1

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

?前のグループが0または1回一致しなければならない文字を意味します。グループは、(-|\s)どちらかのAマッチする-か、|文字を。


1

電話番号の検証は難しい作業であることにも同意する必要があります。この特定の問題については、正規表現を

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

不要になる唯一の要素は最後のダッシュ/スペースだからです。


私は本当に私の正規表現ゲームをアップしようとしています!「The Regex Coach」を使ってあなたの提案をチェックしています。正規表現(()?\ d {3}())?(-| \ s)?\ d {3}(-| \ s)?\ d {4}とターゲット文字列(123)を使用しています456-7890ですが、何らかの理由で最後の7桁しか取得できません。何か案は?
アーロンハサウェイ2010

うん正規表現は、脳に少し荒れています...そして忍耐。/ ^ [(]?(\ d {3})[)]?[-| \ s]?(\ d {3})[-| \ s]?(\ d {4})$ /以前の正規表現の最初の部分はうまくいきませんでした: "(()?\ d {3}())"(()中央の括弧は、実際には正規表現構文の一部として見られ、検索する文字ではありませんでした
リュックヴェローノー

1

入力タグで使用する場合は、このコードが役立ちます。私は自分でこのコードを書いており、これは入力で使用するには非常に良い方法だと思います。ただし、フォーマットを使用して変更できます。これは、ユーザーが入力タグのフォーマットを修正するのに役立ちます。

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input

        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });

    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}

1

非ローカル電話番号(800および900タイプ)を選択するためのソリューションを追加したかっただけです。

(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}

1

この正規表現は、国際電話番号とモバイルセル番号の複数の形式に適しています。

正規表現は次のとおりです。/ ^(+ {1} \ d {2,3} \ s?[(] {1} \ d {1,3} [)] {1} \ s?\ d + | + \ d {2,3} \ s {1} \ d + | \ d +){1} [\ s |-]?\ d +([\ s |-]?\ d +){1,2} $ /

ここにJavaScript関数があります

function isValidPhone(phoneNumber) {
    var found = phoneNumber.search(/^(\+{1}\d{2,3}\s?[(]{1}\d{1,3}[)]{1}\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}$/);
    if(found > -1) {
        return true;
    }
    else {
        return false;
    }
}

これにより、次の形式が検証されます。

+44 07988-825 465(+44の後にはスペースのみが必要であることを除いて、スペースの代わりにハイフンを任意に組み合わせて)

+44(0)7988-825 465((0)の直前または直後にハイフンが存在できず、(0)の前後にスペースが存在する必要がないことを除いて、スペースの代わりにハイフンを組み合わせて使用​​)

123 456-789 0123(スペースの代わりにハイフンを組み合わせて)

123-123 123(スペースの代わりにハイフンを組み合わせて)

123 123456(スペースはハイフンで置き換えることができます)

1234567890

すべてのフォーマットに二重スペースまたは二重ハイフンは存在できません。


1

電話番号を検証し、フォーマットされたデータを返す

function validTel(str){
  str = str.replace(/[^0-9]/g, '');
  var l = str.length;
  if(l<10) return ['error', 'Tel number length < 10'];
  
  var tel = '', num = str.substr(-7),
      code = str.substr(-10, 3),
      coCode = '';
  if(l>10) {
    coCode = '+' + str.substr(0, (l-10) );
  }
  tel = coCode +' ('+ code +') '+ num;
  
  return ['succes', tel];
}

console.log(validTel('+1 [223] 123.45.67'));


1

これを試して

/ ^(\ + {0、})(\ d {0、})([(] {1} \ d {1,3} [)] {0、}){0、}(\ s?\ d + | \ + \ d {2,3} \ s {1} \ d + | \ d +){1} [\ s |-]?\ d +([\ s |-]?\ d +){1,2}( \ s){0、} $ / gm

有効なフォーマット

  • (123)456-7890
  • (123)456-7890
  • 123-456-7890
  • 1234567890
  • +31636363634
  • +3(123)123-12-12
  • +3(123)123-12-12
  • +3(123)1231212
  • +3(123)12312123
  • +3(123)123 12 12
  • 075-63546725
  • +7910 120 54 54
  • 910 120 54 54
  • 8 999 999 99 99

https://regex101.com/r/QXAhGV/1


{1}役に立たない、{0,}書かれている*。なぜこれらすべてのキャプチャグループを使用するのですか?彼らはプロセスを遅くします。
Toto

これは良くない。あなたが好きなように多くの数を入力できるので。
mohammad jawad Barati

1

この機能はうまく機能しました:

let isPhoneNumber = input => {

  try {
    let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
      //extract numbers from string
      thenum = input.match(/[0-9]+/g).join(""),
      totalnums = thenum.length,
      last10Digits = parseInt(thenum) % 10000000000,
      ISDcode = thenum.substring(0, totalnums - 10);

    //phone numbers are generally of 8 to 16 digits
    if (totalnums >= 8 && totalnums <= 16) {
      if (ISDcode) {
        if (ISD_CODES.includes(parseInt(ISDcode))) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    }
  } catch (e) {}

  return false;
}

console.log(isPhoneNumber('91-9883208806'));


0

単純な正規表現: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

フォーマットを確認し、
うまくいくことを願ってください:444-555-1234
f:246.555.8888
m:1235554567


回答をフォーマットしてください(コードブロックのインデントとして4つのスペースを使用してください)。コードの説明もその品質を向上させます。
Nander Speerstra 2017

0
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

これにより、可変形式の電話番号が検証されます。

\\(?\d{3}\\)? 括弧で囲まれた3桁を検索します。

([\-\s\.])? これらの区切り文字を検索するかどうか

\d{3} 3桁を見つけます

\1最初に一致したセパレータを使用します-これにより、セパレータが確実に同じになります。したがって、スペースとダッシュのセパレータがあるため、(000)999-5555はここでは検証しません。「\ 1」を削除して、セパレータサブパターンに置き換えてください(これにより、非標準形式も検証されます)。ただし、とにかくユーザー入力のヒントをフォーマットする必要があります。

\d{4} 4桁を見つける

検証:

  • (000)999 5555
  • (000)-999-5555
  • (000).999.5555
  • (000)999-5555
  • (000)9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

ところでこれはJavaScriptのためのものなので、エスケープを2倍にします。


0

このjs関数を試してください。それが失敗した場合、それが一致し、falseの場合はtrueを返し 文献を

function ValidatePhoneNumber(phone) {
        return /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/.test(phone);
}


0

数字以外はすべて無視してください。

これが私が使うものです:

// USA phones should contain at least 10 digits. For Ukrainian phones it's OK to have only 9 digits, without leading 0 and country code prefix: [+380] 88 888-88-88.
String.prototype.isValidPhone = function(digitsCount) {
  var str = this.trim().match(/\d/g);
  return str && str.length >= (digitsCount || 10); // default is at least 10 digits
}

-1

これを試して

/^[\+]?\d{2,}?[(]?\d{2,}[)]?[-\s\.]?\d{2,}?[-\s\.]?\d{2,}[-\s\.]?\d{0,9}$/im

有効なフォーマット:

  1. (123)456-7890
  2. (123)456-7890
  3. 123-456-7890
  4. 123.456.7890
  5. 1234567890
  6. +31636363634
  7. +3(123)123-12-12
  8. +3(123)123-12-12
  9. +3(123)1231212
  10. +3(123)12312123
  11. 075-63546725

回答には必ず説明を含めてください。うまくいくかもしれませんが、完全で関連性のある情報を得るためには、その方法と理由を説明することが重要です。答えてくれてありがとう:)
Magix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.