web-dev-qa-db-ja.com

携帯電話番号を国番号、市外局番、市内番号に分割する方法は?

携帯電話番号を国番号、市外局番、市内番号に分割する方法は?例:分割後+919567123456

国コード= 91

市外局番= 9567

ローカル番号= 123456

20
Vivart

単純なアルゴリズムで電話番号を解析することはできません。国ごとに電話番号の区切り方が異なるため、各国のルールが入力されたデータテーブルを使用する必要があります。

国コードはかなり簡単です。ウィキペディアの 国の呼び出しコード 記事からのデータを使用して、すべての一意の国コードの表を作成します。国ごとに一意のプレフィックスが付いているので、簡単です。

ただし、サポートするすべての国のルールを調べ、各国のルールを使用して市外局番を抽出する必要があります。

23
Dean Harding

このすべてのデータの独自のテーブルを維持しないでください! 「Java International Phone Number Utilitiesライブラリv3.0」 https://github.com/googlei18n/libphonenumber を使用してください。これはGoogleが使用するものであり、Googleが管理します。

49

さまざまな人が述べたように、単純な文字列マッチングではこれを行うことはできません。国コードも市外局番も固定長です。

過去にこれを行った後、次のような構造のテーブルを維持しました。

 + ------------ + --------- + ------- + ------------- -+ 
 | country_code | area_code | country | area | 
 + ------------ + --------- + ----- -+ -------------- + 
 | 44 | 1634 |イギリス|メドウェイ| 
 | 44 | 20 |イギリス|ロンドン| 
 | 964 | 23 |イラク| Wasit(Al Kut)| 
 | 964 | 2412 |イラク|アンリアル| 
 + ------------ + --- ------ + ------- + -------------- + 

次に、area_codeとcountry_codeの最大長を計算し、最大長から開始して、一致するものが見つかるまで下に向かって部分文字列化することにより、文字列をチェックしました。

したがって、441634666788という番号が与えられます

部分文字列[1,7](7は最も長い国/市外局番の組み合わせの長さ)から開始し、一致が見つからなかった場合は、[1,6]に移動してUK/Medwayの一致を見つけました。

あまり効率的ではありませんが、うまくいきました。

[〜#〜]編集[〜#〜]

このようなものを試すこともできますが、完全なデータセットでテストするか、選択したDBではパフォーマンスが低下する可能性があるため、国や地域コードの選択に分解する必要があるかもしれません。

 DECLARE @area_codes TABLE
(
    country_code VARCHAR(10),
    area_code VARCHAR(10),
    country VARCHAR(20),
    area VARCHAR(20),
    match_string VARCHAR(MAX),
    match_length INTEGER
)

INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)

DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'

SELECT TOP 1 * 
FROM @area_codes 
WHERE @number LIKE match_string
ORDER BY match_length DESC

ヌルの市外局番に対処し、match_string列のテーブルにインデックスを付けるように注意しながら、トリガーを介してmatch_stringおよびmatch_lengthフィールドを維持します。

4
Steve Weet

国や市外局番の辞書のようなものが必要になると思います。彼らのブースは異なる長さを持つことができるので。米国+1、ドイツ+49、さらに+6723。市外局番も同じです。

3
chriszero

答えは国に大きく依存します。 niversal「これは国番号です。これは市外局番です。これは市内番号です」というルールはありません。普遍的に取得できる唯一の情報は国番号です(1〜4桁の長さでもかまいません)。次に、特定の国のルールセットを参照する必要があります。

の例(たとえば、「指定された国には多くの異なる電話番号がありますが、すべて同じですformat " ):

  • +420123456789はチェコ共和国の(偽の)番号(国コード+420)で、残りはIS現地番号です(一部の国では分割されていないアドレス空間を使用していますが、いくつかのビットを推測できます)ローカル番号の最初の1〜4桁のデータ(たとえば、「+ 420800はフリーダイヤル番号」))。したがって、この番号を解析する唯一の便利な方法は、2つの部分+420 123456789
  • +18005551234は米国の(おそらく偽の)番号です。 北米番号計画 によると、+ 1は国番号、800は市外局番(フリーダイヤル番号)、555は交換コード、1234は市内番号です。次に、数値を4つの部分+ 1 800 555 1234に解析できます。
3
Piskvor

努力している場合正確英国のデータ http://code.google.com/p/ofcom-csverter/ も参照してください修正された英国の市外局番の完全なリスト。

1
g1smd

非常に複雑な問題です。最初に 国コード を決定する必要があります。国コードに応じて、残りは市外局番と市内番号に分割する必要があります。ただし、3つのパーツのいずれも固定長ではなく、穴番号もエリアコードもローカルパーツの組み合わせもありません。

例:4930123456789

  • 49はドイツの国コードです
  • 30はベルリンの市外局番です
  • 123456789はベルリンのローカル番号です(実際の番号ではありません)。

例:493328123456

  • 49はドイツの国コードです
  • 3328はTeltowの市外局番です
  • 123456はTeltowの市内番号です(実際の番号はありません)。

例:34971123456

  • 34はスペインの国コードです
  • 971はマヨルカ島の市外局番です
  • 123456はマヨルカの市内番号です(実際の番号ではありません)。
0
Arne Burmeister