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

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

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

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

Q&A

解決済

2回答

2590閲覧

PHP 文字を挿入

curekaishine

総合スコア82

PHP

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

0グッド

0クリップ

投稿2015/11/18 07:29

あいうえお丁目 かきくけこ さしすせそ
たちつてと丁目 なにぬねの はひふへほ

のような丁目と半角スペースしか基準が無い文字列に対して

あいうえお丁目 かきくけこ番地 さしすせそ
たちつてと丁目 なにぬねの番地 はひふへほ

のような場所に「番地」を挿入したいです

preg_replace関数でいけるかなと思案中なのですが
$pattern="/丁目 .+? /";
でHITしたとして$replacement部分はどうかくとよいでしょうか

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

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

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

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

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

KiyoshiMotoki

2015/11/18 07:47

半角スペースで区切られる部分文字列は、3つで固定ですか? 2つだけだったり、4つ以上ある場合を考慮する必要ははありますか?
curekaishine

2015/11/18 07:53

いったんは記述のとおり2つで固定で考えています!
KiyoshiMotoki

2015/11/18 07:56

了解しました。 であれば、Kosuke_Shibuya様の回答で問題ないと思います。 Kosuke_Shibuya様が追記されている内容も、確かに考慮が必要そうですね。
KiyoshiMotoki

2015/11/18 08:37

失礼しました、改めて見たら、私の質問と回答いただいた内容が若干ズレていることに気づきました。 私が質問させていただいた内容は、「あいうえお丁目 かきくけこ」や「あいうえお丁目 かきくけこ さしすせそ たちつてと」を考慮する必要があるか?というものです。
curekaishine

2015/11/18 09:22

なるほど たちつてと は必要ないですね 3つで固定になります 失礼しました
KiyoshiMotoki

2015/11/18 09:24

何度もありがとうございます。 であれば、やはりKosuke_Shibuya様の回答で問題ないと思います。
curekaishine

2015/11/19 04:30

いろいろありがとうございました!
guest

回答2

0

ベストアンサー

php

1 2$str = "あいうえお丁目 かきくけこ さしすせそ"; 3 4$pattern = "/(.*)丁目[ ]+([^ .]*)[ ]+([^ .]*)/"; 5$replace = '$1丁目 $2番地 $3'; 6$str = preg_replace($pattern, $replace, $str); 7var_dump($str);

元々の文字列に「番地」が付いているものを除外する処理は必要になりそう…


###そもそも正規表現でしか実現できないのかを考えよう。

正規表現を使わなくても以下のようにして書くことができる。
何をやっているか明らかなので、メンテナンスもしやすい。

php

1$str = "あいうえお丁目 かきくけこ さしすせそ"; 2$str = str_replace(' ', ' ', $str); 3$arr = explode(" ", $str); 4for ($i = 0; $i < count($arr); $i++) { 5 if ($i == 1 && !strstr($arr[$i], '番地')) { 6 $arr[$i] = $arr[$i] . '番地'; 7 } 8} 9var_dump(implode(' ', $arr));

###そもそも「正規表現」のアプローチは最終手段

自分でパターンを書き起こすことができないなら、使うものではない。のちにバグが見つかったときに、修正できますか?イレギュラーなケースが出てきたときに、パターンの変更に対応できますか?

「正規表現」は複雑だし、学習コストも高い。よってメンテナンス性が著しく低い。複雑な条件が書かれたものを後で引き継ぐ人の負担を考えよう。「正規表現」を使わなくても目的が達成できるなら、使わないのが吉。

投稿2015/11/18 07:37

編集2015/11/18 08:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

curekaishine

2015/11/18 08:06

ありがとうございます すみません 間の半角スペースが1つの場合はどうなりますでしょうか・・ もともとの文字列に番地がある場合削除する必要というのは理解できました!
退会済みユーザー

退会済みユーザー

2015/11/18 08:13 編集

> 間の半角スペースが1つの場合はどうなりますでしょうか この質問が出てくるということは試してもいないですよね。試してから質問してください。
curekaishine

2015/11/18 08:20

ちゃんと動きますね 半角スペースがひとつの場合以下のように省略できるかなと思いつつ $pattern = "/(.*)丁目 (.*) (.*)/"; [ ]+([^ .]*) がなぜ必要なのかがわからないでした・・ スペース一回以上。行頭にスペース任意一文字パターンの繰り返し という解釈なのですがそもそもこれは合っていますか?
退会済みユーザー

退会済みユーザー

2015/11/18 09:23 編集

$pattern = "/(.*)丁目[ ]+(.*)[ ]+([.*)/"; で試してみてください →「番地」の前に無駄なスペースが入ります。
KiyoshiMotoki

2015/11/18 08:39

Kosuke_Shibuya様、申し訳ありません。 横から茶々を入れさせていただいております。。
退会済みユーザー

退会済みユーザー

2015/11/18 08:59 編集

> KiyoshiMotokiさん いえいえ、お構いなく!私も回答に補足したのですが、「正規表現」に対する考え方として、このように考えております。
KiyoshiMotoki

2015/11/18 08:59

Kosuke_Shibuya様、返信ありがとうございます。 > 「正規表現」のアプローチは最終手段 私は"最終手段"とまでは思いませんが、 正しく動くか少しでも自信がなくなったら、やはりもっと簡単な手段を選びますね。 誰の言葉か忘れましたが、 「プログラムの変更には、新規に実装する場合の2倍の能力が必要である」 (つまり、最大限の能力を駆使して実装したプログラムは自分でメンテナンスできない) とうものが、頭をよぎりますのでw。
退会済みユーザー

退会済みユーザー

2015/11/18 09:06

「最終手段」は言い過ぎかもしれませんが、自分が関わっているプロジェクトではそういう位置付けにしています。自分自身、あまり「正規表現」が得意でもないし、メンテナンスの手間を考えると、他のアプローチで実現できる場合、「正規表現」は使いませんね… なので、自分の場合「正規表現」のパターンが書けないときは、そのアプローチは諦めます。
curekaishine

2015/11/18 09:36

>$pattern = "/(.*)丁目[ ]+(.*)[ ]+([.*)/"; >で試してみてください 不要そうな[をひとつ消して実行して問題なさそうです ()の中の部分が$1$2$3に入るということなんですねふむふむー 今回こそは正規表現でやってみようと思い立ったのでw
curekaishine

2015/11/18 12:02

おっとすみません知ってはいたのですが成果物の中につかうのは初めてだったので・・ いろいろと丁寧にありがとうございます  回答を参考にして課題が解けそうです
guest

0

preg_系はとても遅いので、できるだけ正規表現を使用しないようにしたほうがいいと思います。

php

1$text = 'あいうえお丁目 かきくけこ さしすせそ'; 2$text = explode(' ', $text); 3echo $text[0] . $text[1] . '番地' . $text[2];

確認はしていないですがこれで動くんじゃないでしょうか。

投稿2015/11/18 08:45

ckaposndbbba

総合スコア210

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問