電話番号に - を入れたい(Apps Script/Javascript 対応)...
電話番号をフォームなどで入力された際に、いろいろなフォーマットで電話番号を入力されてくることがあり、それをノーマライズしたくなりコードを考えてみました。
電話番号には、固定電話、携帯電話、サービス電話などがあり、桁数も 10桁あり、11桁ありとややこしい上、市外局番の桁数も地域によって変わるのでちょっと悩ましい。さらには、国際電話もあるのでどうするかちょっと悩みました。
国番号
指定された電話番号が、+で始まる場合に、先頭の 1-5 桁を国番号と考え、国番号の一覧にマッチさせて、国番号とそれ以外に分割します。国番号が 81(日本)の場合は、市街局番、市内局番と下4桁の分割を行います。
81(日本)以外の場合は、国番号以下はそのまま返します。
国番号一覧は、 下記URL から取得したものを利用しています。
https://countrycode.org/
市外局番で場合分け
指定された電話番号が 0 で始まらない場合は、先頭に 0 を追加してから、下記のように場合分けしていきます。
市外局番の一覧は、総務省のページからワードをワードドキュメントをダウンロードして入手しました。
市外局番の桁数の長い方からマッチさせていきます
(例: 電話番号が、0422で始まる場合は、市外局番 0422 でマッチさせ、 04 ではマッチさせない。)
- 10桁固定電話
先頭5桁が、5桁の市街局番にマッチする場合は、0xxxx-x-xxxx
先頭4桁が、4桁の市街局番にマッチする場合は、0xxx-xx-xxxx
先頭3桁が、3桁の市街局番にマッチする場合は、0xx-xxx-xxxx
先頭2桁が、2桁の市街局番にマッチする場合は、0x-xxxx-xxxx
- 10桁のサービス電話番号(0120,0800,0570,0990)
先頭4桁が、0120,0800,0570 または、0990にマッチする場合は、0xxx-xx-xxxx
- 11桁の携帯電話および、050IP電話
先頭3桁が、020,050,060,070,080,090 にマッチする場合は、0xx-xxxx-xxxx
出力
国番号なしの電話番号の場合は、-区切りで出力します。
+国番号で始まる電話番号の場合は、+国番号-XXXXXXXXX
(ただし、国番号が 81 の場合は、 XXXXXXXXXも - 区切りになります。)
注意:国番号や市街局番は、時々変更されます。ハードコードされているのでメンテナンスが必要です。
function NormalizePhone(str) {
// 国番号処理
let prefix_country = /^[+](1-809|1-829|1-849|1-658|1-876|1-787|1-939|1-242|1-246|1-264|1-268|1-284|1-340|1-345|1-441|1-473|1-649|1-664|1-670|1-671|1-684|1-721|1-758|1-767|1-784|1-808|1-868|1-869|1-907|88216|211|212|213|216|218|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|247|248|249|250|251|252|253|254|255|256|257|258|260|261|262|263|264|265|266|267|268|269|290|291|297|298|299|350|351|352|353|354|355|356|357|358|359|370|371|372|373|374|375|376|377|378|380|381|382|383|385|386|387|389|420|421|423|500|501|502|503|504|505|506|507|508|509|590|591|592|593|594|595|596|597|598|599|670|672|673|674|675|676|677|678|679|680|682|683|685|686|687|688|689|690|691|692|850|852|853|855|856|880|886|960|961|962|963|964|965|966|967|968|970|971|972|973|974|975|976|977|992|993|994|995|996|998|20|27|30|31|32|33|34|36|39|40|41|43|44|45|46|47|48|49|51|52|53|54|55|56|57|58|60|61|62|63|64|65|66|81|82|84|86|90|91|92|93|94|95|98|1|7)(.*)$/
let m = str.toString().replace(/[()]/g,'').match(prefix_country)
let prefix = ''
let tel = ''
if (m == null) {
tel = str
} else {
prefix = m[1]
tel = m[2]
}
if (prefix == '' || prefix == '81') {
tel = tel.toString().replace(/[-()\s]/g, '')
if (tel.length != 0 && '123456789'.indexOf(tel.substring(0, 1)) > -1) tel = '0' + tel
// 国内電話番号処理
tel = tel.replace(/^0(1267|1372|1374|1377|1392|1397|1398|1456|1457|1466|1547|1558|1564|1586|1587|1632|1634|1635|1648|1654|1655|1656|1658|4992|4994|4996|4998|5769|5979|7468|8387|8388|8396|8477|8512|8514|9802|9912|9913|9969)(\d)(\d{4})$/, "0$1-$2-$3");//固定電話市外5桁
tel = tel.replace(/^0(123|124|125|126|133|134|135|136|137|138|139|142|143|144|145|146|152|153|154|155|156|157|158|162|163|164|165|166|167|172|173|174|175|176|178|179|182|183|184|185|186|187|191|192|193|194|195|197|198|220|223|224|225|226|228|229|233|234|235|237|238|240|241|242|243|244|246|247|248|250|254|255|256|257|258|259|260|261|263|264|265|266|267|268|269|270|274|276|277|278|279|280|282|283|284|285|287|288|289|291|293|294|295|296|297|299|422|428|436|438|439|460|463|465|466|467|470|475|476|478|479|480|493|494|495|531|532|533|536|537|538|539|544|545|547|548|550|551|553|554|555|556|557|558|561|562|563|564|565|566|567|568|569|572|573|574|575|576|577|578|581|584|585|586|587|594|595|596|597|598|599|721|725|735|736|737|738|739|740|742|743|744|745|746|747|748|749|761|763|765|766|767|768|770|771|772|773|774|776|778|779|790|791|794|795|796|797|798|799|820|823|824|826|827|829|833|834|835|836|837|838|845|846|847|848|852|853|854|855|856|857|858|859|863|865|866|867|868|869|875|877|879|880|883|884|885|887|889|892|893|894|895|896|897|898|920|930|940|942|943|944|946|947|948|949|950|952|954|955|956|957|959|964|965|966|967|968|969|972|973|974|977|978|979|980|982|983|984|985|986|987|993|994|995|996|997)(\d{2})(\d{4})$/, "0$1-$2-$3");//固定電話市外4桁
tel = tel.replace(/^0(11|15|17|18|19|22|23|24|25|26|27|28|29|42|43|44|45|46|47|48|49|52|53|54|55|58|59|72|73|75|76|77|78|79|82|83|86|87|88|89|92|93|95|96|97|98|99)(\d{3})(\d{4})$/, "0$1-$2-$3");//固定電話市外3桁
tel = tel.replace(/^0(3|4|6)(\d{4})(\d{4})$/, "0$1-$2-$3");//固定電話市外2桁
tel = tel.replace(/^0(120|800|570|990)(\d{2})(\d{4})$/, "0$1-$2-$3");//10桁のサービス電話番号(0120,0800,0570,0990)
tel = tel.replace(/^0(50|80|90|20|60|70)(\d{4})(\d{4})$/, "0$1-$2-$3");//11桁の携帯および、080,050IP電話
}
// バグフィックス
return (prefix == '') ? tel : "+" + prefix + "-" + tel.replace(/^0/,'');
}