実現したいこと
ある文字列の半角数字以外を全てハイフンにしたいのですが、ハイフンが連続する場合は1つだけにしたいです。
前提
漢数字や全角半角数字、様々な横棒が入り乱れる文字列を、正規表現などで置換して整えようとしています。
実現したい要件は以下です。
・漢数字は半角アラビア数字に、全角数字も半角に変換
・一部の記号(、・~)以降の文字列は削除する
・半角数字以外の文字を全てハイフンに変換
例えば二番地178-9号11~13
は2-178-9-11
に
二番地178-9号11、二番地178-9号13
も2-178-9-11
になるようなコードを考えています。
ちなみに、一部の記号(、・~)は同時に出現することはないです。
該当のソースコード
php
1$test = "二番地178-9号11~13"; 2 3$number = [ 4 "一" => 1, 5 "二" => 2, 6 "三" => 3, 7 "四" => 4, 8 "五" => 5, 9 "六" => 6, 10 "七" => 7, 11 "八" => 8, 12 "九" => 9, 13]; 14 15// 漢数字をアラビア数字に 16$test = str_replace(array_keys($number), array_values($number), $test); 17var_dump($test); 18// string(30) "2番地178-9号11~13" 19 20// 全角数字を半角数字に 21$test = mb_convert_kana($test, 'n', 'UTF-8'); 22var_dump($test); 23// string(24) "2番地178-9号11~13" 24 25// 指定文字以降を削除 26$test = preg_split('/[、・~]/u', $test, 2)[0]; 27var_dump($test); 28// string(19) "2番地178-9号11" 29 30// 問題はここからです 31 32// 半角数字以外の文字を全てハイフンに変換 33$test = preg_replace('/\D/', '-', $test); 34var_dump($test); 35// string(19) "2------178---9---11" 36
マルチバイト文字を置き換えているので、1文字につきハイフンが3つになるのは承知しているのですが、
それも含めてハイフン1個に縮まらないかと思案しています。
試したこと
explode()
php
1$test = explode('-', $test); 2var_dump($test); 3 4array(13) { [0]=> string(1) "2" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) [6]=> string(3) "178" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(1) "9" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(2) "11" }
preg_split()
php
1$test = preg_split('/-/', $test, PREG_SPLIT_NO_EMPTY); 2var_dump($test); 3 4array(1) { [0]=> string(19) "2------178---9---11" }
補足情報
ハイフン以外にも、前半のコードでもっとスマートな書き方があればご教授願いたいです。
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/17 08:18
2021/03/17 08:26
2021/03/17 08:45
2021/03/17 08:50