PHPで文字列から数字以外を削除する方法

こんにちは、さるまりんです。

電話番号の文字列ってどんな形式ですか?

090-1234-5678
(090)1234-5678
090(1234)5678

これにスペースが入ってこんなになったり
(090) 1234-5678
090 (1234)5678

なぜか+81の国番号が入ってこんなになっていたり
+81 90 1234 5678

全角数字も混ざっててこんなになってることもあるかも

(090)12345678

数字以外を全て削除して数字のみの文字列にしたいときこんなふうにします。

$tel = preg_replace( '/[^\p{Nd}]/u', '', $tel);

さらに全角文字から半角文字にするにはこうです。

$tel = mb_convert_kana( $tel, 'n', 'UTF-8');

上の例で試してみます。

$tels = [
'090-1234-5678',
'(090)1234-5678',
'090(1234)5678',
'(090) 1234-5678',
'090 (1234)5678',
'+81 90 1234 5678',
'(090)12345678'
];

foreach ($tels as $tel) {
    $new_tel = preg_replace( '/[^\p{Nd}]/u', '', $tel);
    $new_tel = mb_convert_kana( $new_tel, 'n', 'UTF-8');
    echo "$tel -> $new_tel\n";
}

実行すると

$ php remove-non-numeric.php
090-1234-5678 -> 09012345678
(090)1234-5678 -> 09012345678
090(1234)5678 -> 09012345678
(090) 1234-5678 -> 09012345678
090 (1234)5678 -> 09012345678
+81 90 1234 5678 -> 819012345678
(090)12345678 -> 09012345678

どうですか?数字以外の文字が消えて、全角文字も半角に揃っていますね。

+81始まりの電話番号をどうするかは考えないといけないですが、それ以外は同様に活用できそうです。

電話番号や住所、かなり揺れがあるものなのでそれらをどう使うか色々考えてみたいと思います。

読んでくださってありがとうございました。

それではまた!