質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Q&A

解決済

1回答

843閲覧

半角数字以外をハイフンにしたい

Dammyyy

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

0グッド

0クリップ

投稿2021/03/17 07:53

実現したいこと

ある文字列の半角数字以外を全てハイフンにしたいのですが、ハイフンが連続する場合は1つだけにしたいです。

前提

漢数字や全角半角数字、様々な横棒が入り乱れる文字列を、正規表現などで置換して整えようとしています。

実現したい要件は以下です。

・漢数字は半角アラビア数字に、全角数字も半角に変換
・一部の記号(、・~)以降の文字列は削除する
・半角数字以外の文字を全てハイフンに変換

例えば二番地178-9号11~132-178-9-11
二番地178-9号11、二番地178-9号132-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" }

補足情報

ハイフン以外にも、前半のコードでもっとスマートな書き方があればご教授願いたいです。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純に、preg_replace('/\D+/u', '-', $test);でいいのではないでしょうか。

正規表現は、(特に指定しない限り)最長のものに一致します。

投稿2021/03/17 08:00

maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dammyyy

2021/03/17 08:18

ありがとうございます!実現できました! 指定がないと伸びてしまうので絞り込むんですね。。
maisumakun

2021/03/17 08:26

逆です。+をつけて「連続する数字以外の文字」とまとめて一致させています。
Dammyyy

2021/03/17 08:45

逆でしたか…。 質問を重ねてしまうようで申し訳ないのですが、 「連続する、数字以外の文字」か 「連続する数字、以外の文字」か とすると前者で合ってますでしょうか。
maisumakun

2021/03/17 08:50

はい、「数字以外の文字の連続」です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問