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

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

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

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

Q&A

3回答

2068閲覧

phpでの置換

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2014/10/26 10:19

以下の様な文字列があったとします。

lang

1 2ほげ{{1}} 3ほげ{{2}} 4

これを以下のように置換したいと思っています。

lang

1 2ほげいち 3ほげに 4

その際にいちは以下の変数を使いたいです。

lang

1 2$hoge = array( 3 4 1 => 'いち', 5 2 => 'に', 6 7); 8

{{}}の間の文字をキーとして、その値に置換するという感じです。
どうしたらよいでしょう。

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

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

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

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

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

guest

回答3

0

この種の置換では、同じプレースホルダ({{hoge}} みたいなやつ)が2回置換されないように留意する必要があります。

もし置換のパターンが次のようなものだとすると、

{{1}} -> {{2}} {{2}} -> に

入力文字列が ほげ{{1}}\nほげ{{2}} だとすれば、普通は ほげ{{2}}\nほげに になることを期待すると思いますが、このケースでループで回して1個ずつ置換したり str_replace で一括置換とかすると、{{1}}{{2}} のどちらが先に置換されるかで結果が変わります。

<?php $input = "ほげ{{1}}\nほげ{{2}}"; $search = array("{{1}}","{{2}}"); $replace = array("{{2}}","に"); $input = str_replace($search,$replace,$input); echo $input; // ほげに\nほげに
<?php $input = "ほげ{{1}}\nほげ{{2}}"; $search = array("{{2}}","{{1}}"); $replace = array("に","{{2}}"); $input = str_replace($search,$replace,$input); echo $input; // ほげ{{2}}\nほげに

strtr にはこのような問題はないので、strtr の方が良いと思われます。

<?php $input = "ほげ{{1}}\nほげ{{2}}"; $input = strtr($input, array( '{{1}}' => "{{2}}", '{{2}}' => "に", )); echo $input; // ほげ{{2}}\nほげに
<?php $input = "ほげ{{1}}\nほげ{{2}}"; $input = strtr($input, array( '{{2}}' => "に", '{{1}}' => "{{2}}", )); echo $input; // ほげ{{2}}\nほげに

作りこむなら preg_replace_callback で次のようにするのが良いでしょう。

<?php $input = "ほげ{{1}}\nほげ{{2}}"; $hoge = array( 1 => "{{2}}", 2 => "に", ); $input = preg_replace_callback('/{{(\w+)}}/', function ($m) use ($hoge) { $i = $m[1]; if (isset($hoge[$i])) { return $hoge[$i]; } else { return null; } }, $input); echo $input; // ほげ{{2}}\nほげに

投稿2014/10/28 04:35

ngyuki

総合スコア4514

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

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

0

初めまして、mogemogeさん。
解答失礼いたします。

phpの置換には
str_replace()
preg_replace()
ereg_replace()
strtr()
などいくつかの関数が用意されております。

今回は、変換したい文字列や、変換後の文字列が
予め分かり、変数に用意してあるという前提になるので、
一番単純で高速に処理ができる、str_replace()を使った方法をお勧めいたします。

lang

1<?php 2 $input = "ほげ{{1}}\nほげ{{2}}"; 3 4 $hoge = array( 5 1 => 'いち', 6 2 => 'に' 7 ); 8 9 foreach($hoge AS $key => $replace){ 10 $search = "{{" . $key . "}}"; 11 $input = str_replace($search,$replace,$input); 12 } 13 14 echo $input; 15 // ほげいち\nほげに 16?>

また質問者様がご用意された変数ではありませんが、以下の様な形の
変数を用意することが可能でしたら、簡潔にコードを書くことが可能です。

lang

1$search = array("{{1}}","{{2}}"); 2$replace = array("いち","に");

$searchには変換前の文字列、$replaceには変換後の文字列を
格納しておきます。

lang

1<?php 2 $input = "ほげ{{1}}\nほげ{{2}}"; 3 $search = array("{{1}}","{{2}}"); 4 $replace = array("いち","に"); 5 6 $input = str_replace($search,$replace,$input); 7 echo $input; 8?>

str_replace関数は第一引数と第二引数に配列を渡すと、配列の順に
置換を行ってくれるので、1行のコードで置換することが出来ますので、
こちらの方法を検討してみてもよろしいのではないでしょうかと思い、
解答させていただきました。

投稿2014/10/27 05:42

rui3718

総合スコア113

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

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

0

置換用の連想配列$hogeのキーと値を、それぞれstr_replaceの引数にとればできますが、hogeのフォーマットが質問の通りに指定されている場合はフォーマット整形が必要になると思います。

lang

1$sInput = 'ほげ{{1}} 2ほげ{{2}}'; 3$hoge = array( 4 1 => 'いち', 5 2 => 'に', 6); 7 8$search = array(); 9$replace = array(); 10foreach ($hoge as $key => $val) { 11 $search[] = '{{' . $key . '}}'; 12 $replace[] = $val; 13} 14/* 15$search = array( 16 '{{1}}', 17 '{{2}}', 18); 19$replace = array( 20 'いち', 21 'に', 22); 23*/ 24str_replace($search, $replace, $sInput);

投稿2014/10/26 12:57

gittib_gittib

総合スコア102

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問