以下の様な文字列があったとします。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
総合スコア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
総合スコア102
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。