_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ _/ _/ ソフト名:電話番号のハイフン検証/編集関数 (Ver 1.00 , 番号翻訳テーブル:2022/7/1 版) _/ _/ 種 別:フリーソフト _/ 開発環境:Windows10 (言語別の開発環境は後述) _/ 動作環境:言語別の開発バージョンを参照 _/ _/ 著作権者:角田 桂一 < addinbox@h4.dion.ne.jp > _/ < http:_/addinbox.sakura.ne.jp/index.htm > _/ _/ ソフト解説: Tips29: JavaScriptで電話番号(局番)のハイフン検証/編集 _/ < http:_/addinbox.sakura.ne.jp/Excel_Tips29.htm > _/ _/ 免 責 :このソフトを使用したことで発生したいかなる損害に _/ ついても、作者は一切責任を負わないものとします。 _/ 再配布 :内容を改変しないという条件で、再配布は自由です。 _/ 転 載 :無断転載はご遠慮願います。 _/ 履 歴 :β 1.00 , 2019/ 2/14 _/ β 4.40 , 2019/ 3/27 _/ Ver 1.00 , 2019/ 4/ 4 (番号翻訳テーブル:2019/4/1 版) _/ Ver 1.00 , 2019/ 5/11 (番号翻訳テーブル:2019/5/7 版) _/ Ver 1.00 , 2020/ 7/20 (番号翻訳テーブル:2020/6/1 版) _/ Ver 1.00 , 2022/ 8/ 2 (番号翻訳テーブル:2022/7/1 版) _/ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 1.配布ファイルを解凍すると、下記のフォルダ/ファイルに展開されます。   まず、適当なフォルダに配布ファイルを解凍して保存してください。 尚、解凍する前に「ファイル の プロパティ」ダイアログにて、配布 ファイルの【 セキュリティ ブロック の 解除 】 を行なって下さい。   特にヘルプファイルはセキュリティブロックを解除しないと表示できません。 TelephoneCheck_ReadMe.txt …… このファイル TelephoneCheckHelp.chm …… ヘルプファイル JavaScript ( Win10, FireFox/Chrome/IE11/Edge にて動作確認 ) ├─ TelephoneCheck.js └─ TelephoneCheck_JS_Test.htm JAVA ( JAVA 8u192 にて動作確認 ) ├─ TelephoneCheck.java └─ TelephoneCheck_JAVA_Test.java Perl ( Perl 5.14.2 にて動作確認 ) ├─ TelephoneCheck.pl └─ TelephoneCheck_Perl_Test.pl PHP ( PHP 5.6.39 にて動作確認 ) ├─ TelephoneCheck.php └─ TelephoneCheck_PHP_Test.php Python ( Python 3.7.2 にて動作確認 ) ├─ TelephoneCheck.py └─ TelephoneCheck_Python_Test.py Ruby ( Ruby 2.5.3 にて動作確認 ) ├─ TelephoneCheck.rb └─ TelephoneCheck_Ruby_Test.rb VBA_VB6 ( Excel2010/VBA にて動作確認 ) ├─ TelephoneCheck.bas ├─ TelephoneCheck_VBA_Test.bas └─ PhoneNumberAddin.xla VBnet ( VB2017/ .NET Framework 4.6.1 にて動作確認 ) ├─ TelephoneCheck.vb └─ TelephoneCheck_VBnet_Test.vb *1: ファイルの文字コードは JavaScript , VBA/VB6 , VB.net ファイルは Shift_JIS 他のファイルは UTF-8N です。 *2: Python版は「タブ区切り」でインデントしています。 *3: VBA/VB6のソースコード/テストコードファイル では、先頭に「モジュール名を 指定する Attributeステートメント」 が入っています。 そのまま インポート すれば「標準モジュール名 : TelephoneCheck / TelephoneCheck_Test 」とし て組み込まれます。 *4: VBA_VB6/PhoneNumberAddin.xla は Excel用のアドイン(インターフェースは PhoneNumber 関数のみ)です。 *5: 各言語のソースコードはブラウザでも下記URLから閲覧できます。 ソースコード: http://addinbox.sakura.ne.jp/AreaCode/ColorSource_JS_unused_JSON.htm テストツール: http://addinbox.sakura.ne.jp/Excel_Tips29_Test1.htm 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 2. 電話番号 編集/検証 ツール [ TelephoneCheck ] について  この TelephoneCheck ツール は、日本の電話番号について、 ( a ) 電話番号の妥当性チェック ( 局番の割り当て有無, 電話番号の長さ ) を行なう。 ( b ) 局番に応じた 区切り編集を施す。 ( c ) 区切り編集された電話番号の 「区切り位置」 等の チェック を行なう。  という機能を提供します。 番号翻訳テーブル という 形態の 局番収録データ により、  日本全国の 市外局番+市内局番 を正しく反映した 区切り編集 が可能です。  現在、電話番号の 「チェック および 区切り編集」 で広く使われている手法は主に  下記の 1&2 ですが、このTelephoneCheck ツールは、それとは全く異なる第3の  手法を採用しています。  --- ( 1 ) テーブル検索 --- ( a ) 全ての局番データを単純にテーブル化する 「局番(6桁, '0'+市外局番+市内局番)+市外局番桁数」というセットで全ての     局番のデータをテーブル内に収録してあれば、電話番号の上6桁固定でテーブル     検索を1回すれば事足ります。局番テーブルを用意する側でも、市外局番を調べる     側でも共に単純な作業/処理で片付きます。問題は局番テーブルのデータ数が2万     4千件程になるということでしょう。バックボーンにしっかりとしたデータベース     を備えているならば可能ですが、JavaScript だけで対応しようとするには荷が重     いでしょう。 ( b ) 市外局番だけでテーブル化する 市外局番だけであれば380件程ですので、ソースコード内に収録する事も可能     でしょう。ただし、単純に市外局番のリストを並べただけでは正しく検索する事     はできません。 市外局番のリストを桁数( 2, 3, 4, 5 桁)ごとにテーブル分割して収録し、5     ⇒ 4 ⇒ 3 ⇒ 2 桁の順で[前方一致検索] を繰り返し試すという手順で該当     する市外局番を探し出します。 但し、下記の例のように「同じ数字の並び」であっても、市内局番の割り当て方     によって市外局番が異なる(即ち、市外局番の桁数が異なる)という地域が数多     く存在します。その為、「市外局番だけ」というテーブルデータでは100%正     しい結果を得ることはできません。 [ 09934xxxxx ] ⇒ 0993-40-FGHJ , 0993-41-FGHJ , 099-343-FGHJ 099-345-FGHJ , 099-347-FGHJ , 0993-49-FGHJ 「上記のような地域のみ市内局番まで含める」というような何らかの配慮が必要     になります。  --- ( 2 ) 正規表現の利用 --- 「正規表現」 を駆使して局番の判定&電話番号の分割を行なう というものです。   しかし、電話番号には地域 ( 局番 ) によって区切り位置 ( 市外局番-市内局番 )   が様々である為、正規表現で完璧に仕上げようとするのは非常に困難です。 近辺の地域限定ならいざ知らず、日本全国全ての地域 ( 局番 ) を完璧にカバー   する定義を自力で作り上げるのは無理を通り越して無謀と言っても良いでしょう。   幸いにして、フリーで利用できるツールが公開されていますので、それを利用する   ことをお薦めします。 ( a ) Google 製の libphonenumber ライブラリ 電話番号編集ツールとしてはもっとも有名なものでしょう。日本全国のみ      ならず世界中の電話番号を網羅しています。勿論、上記の [ 09934xxxxx ]      のような地域も完璧にフォローされています。 libphonenumber ライブラリ で使われている正規表現を見てみると非常に      複雑で細かい記述となっているのが見て取れます。 ( 下記 GitHub の metadata.js , 日本の定義は 3815行目〜 ( 2019/4/30 現在) , [ 日本部分の抜粋 ] ) https://github.com/googlei18n/libphonenumber/tree/master/javascript/i18n/phonenumbers ( b ) Cleave.js 等 Cleave.js 等、他にも幾つか電話番号の フォーマット を行なえる製品が      あります。但し、それらも中でlibphonenumber ライブラリ を利用してい      ますので、正規表現ツールとしては libphonenumber 一択と言えるでしょう。  --- ( 3 ) AddinBox製 TelephoneCheck ツール が採用している『電話番号翻訳』 --- この TelephoneCheck ツール は、今までの 「テーブル検索/正規表現 を駆使する」   という手法とは全く異なり、「電話番号翻訳テーブル という 局番 データ を使って   電話番号翻訳を行なう」 という アプローチ で電話番号 の フォーマット を行ない   ます。   尚、電話番号翻訳という手法は、電話交換機が電話番号から通話路を決定するルーティ   ング処理で使っている手法です。それ故に非常に高速に処理できるという特徴を持って   います。 後述しますが、電話番号翻訳テーブルは「リンクチェーンテーブル」の構造をしており、   電話番号の各桁の数字を基にリンクチェーンを辿ります。殆どの電話番号では上3桁   ("0"の次から)迄で完了できるでしょう。 つまり、テーブル内の3要素にアクセスするだけで完了します(1要素ごとにテーブル   内を探し回るようなことはなく、リンクチェーンによるダイレクトアクセスとなります)。   この仕組みはヘルプ内の「番号翻訳シュミレータ」で実感できるでしょう。   (上記の [ 09934xxxxx ] 地域を試してみると良いですよ) 「大量のテーブルデータの中を探し回る『テーブル検索』手法」や「重い解釈エンジンを   通す『正規表現』手法」と比べて処理の負担が小さい軽量高速な手法といえます。ちな   みに、番号翻訳テーブルのデータ数は携帯電話等を含めても140件弱で済んでいます   ので、ソースコード内にそのまま収録しても邪魔になりません(実際にソースコードを   確認してみてください)。   --------------------------------------------------------------------------------   この TelephoneCheck ツールは、元々Excel アドイン「kt電話郵便アドイン」の   [ ktTelEdit 関数 ] に実装してきた機能です( 2004年10月 リリース ) 。   それを JavaScript & JSON (番号翻訳テーブル)というスタイルで JavaScript   ツールとして移植しました( TeleponeCheck_withJSON.js ) 。   その後、JSON (番号翻訳テーブル) の内容を必要最小限に縮小加工してソース   コード内に収録した派生バージョン を作成しました ( TelephoneCheck.js )。   この TelephoneCheck ツールでは FormatTelephone 他 幾つかの関数を提供して   いますが、通常の使用では PhoneNumber 関数ひとつで充分です。   更に、派生バージョン を基にして 他の言語 への移植版 も リリース しています。   2019年4月 現在 … JAVA , PHP , Perl , Python , Ruby , VBA/VB6 , VB.net 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 3.電話番号翻訳テーブル について 「電話番号翻訳テーブル」の詳細(構造/動作原理 等)については下記サイトを参照して ください。 http://addinbox.sakura.ne.jp/Excel_Tips29.htm 下記URLからデモツール(JavaScript版)で動作を試せます。 デモツール : http://addinbox.sakura.ne.jp/Excel_Tips29.htm#Demo 番号翻訳シュミレーター: http://addinbox.sakura.ne.jp/Excel_Tips29.htm#S3_2 ヘルプファイルにも同様の解説/デモツールを載せてあります。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 4.サポートしている電話番号 について 下記の電話番号をサポートしています。 固定電話 10桁(先頭 0) [ 0ABCDE-FGHJ ] 全国の市外局番を忠実に対応 携帯電話 11桁(先頭 070/080/090) [ 0x0-CDEF-GHJK , C:1-9 ] 補:060は実施未定 着信課金 10桁(先頭 0120) [ 0120-DEF-GHJ ] 着信課金 11桁(先頭 0800) [ 0800-DEF-GHJK ] IP電話 11桁(先頭 050) [ 050-CDEF-GHJK , C:1-9 ] M2M 11桁(先頭 020x) [ 020-CDE-FGHJK , C:1-3,5-9 ] ポケベル 11桁(先頭 0204) [ 020-4DE-FGHJK ] FMC 11桁(先頭 0600) [ 0600-DEF-GHJK ] 情報料代理徴収 10桁(先頭 0990) [ 0990-DEF-GHJ ] 全国統一番号 10桁(先頭 0570) [ 0570-DEF-GHJ ] 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 5.他言語 への移植についてのお願い 「他言語への移植」については必ずご連絡をお願いします。 また、他言語のライブラリ共有コミュニティ ( GitHub 等 )へ無断(事後承諾 含む)で アップロードされますと、私 ( AddinBox 角田 ) の管理から外れてしまいますので 御遠慮願います。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜