文字の反復と置き換え - PHPプロ!Q&A掲示板

2804

  • 0P

文字の反復と置き換え

質問日時 / 2010年7月11日 14:39    回答数 / 8件

Questioner:  girls  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

文字の反復と置き換えがうまくいかないので知恵をおかし頂ければ幸いですm(__)m

以下に三つの顔文字があります。

(^v^)
(*^_^*)
(>_<)

これをそれぞれ
<input type="text" value="">
に当てはめて、

最終的には、
<input type="text" value="(^v^)">
<input type="text" value="(*^_^*)">
<input type="text" value="(>_<)">

と表示させたいです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<title>テスト</title>
</head>
<body>
<form action="./test.php" method="post">
顔文字<br />
<textarea name="t1" cols="20" rows="5">(^v^)
(*^_^*)
(>_<)</textarea><br />
共通部分指定<br />
<textarea name="t2" cols="20" rows="5">
<input type="text" value="ここ" />
</textarea><br />
<input type="submit" value="決定" />
</form>
<?php
$kao=$_POST['kao'];
$t1=$_POST['t1'];
$t2=htmlspecialchars($_POST['t2']);
$array=explode("\n","$t1");
if(($t1)and($t2)){
$count=0;
foreach($array as $item){
$t2=str_replace("ここ","$item[$count]","$t2");
echo"$t2";
$count++;
}
}
?>
</body>
</html>

顔文字をtextarea1に書きます。
この時、改行して書きます。
そして共通となる<input type="text" value="" />をtextarea2に書きます。
この挿入するvalueの部分に『ここ』と書いておきます。

これでforeachの時に、『ここ』という文字をそれぞれの顔文字に置き換えたいのですが、どうもうまくいきません。

<input type="text" value="(^v^)">
<input type="text" value="(*^_^*)">
<input type="text" value="(>_<)">

のように表示させるには、どうしたらよいでしょうか??
宜しくお願い致します。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix>この挿入するvalueの部分に『ここ』と書いておきます
┃┗A01-1girlsご返信ありがとうございます。 共通となる <input
┃ ┗A01-1-1shimix>今回はどうしてもformを使いたいです。 >何故ならオ
┃  ┗A01-1-1-1girlsご返答ありがとうございます。 わかりずらくて申し訳
┃   ┗A01-1-1-1-1shimixじゃぁ、 >>CODE <?php $t1 = $_POST['t1']; $t
┃    ┗A01-1-1-1-1-1girlsご返答ありがとうございますm(__)m お陰様で出来まし
┃     ┗A01-1-1-1-1-1-1shimix>ところで、$out="";ってなんでしょうか?? >初期化す
┃      ┗A01-1-1-1-1-1-1-1girlsご返答ありがとうございますm(__)m 詳しく教えて頂
┗A02yuu_a0この意見は投稿者によって削除されました。

回答一覧

並び替え:

A01
answerershimix [7月11日 16:22]

>この挿入するvalueの部分に『ここ』と書いておきます。
>
>これでforeachの時に、『ここ』という文字をそれぞれの顔文字に置き換えたいのですが、
>どうもうまくいきません。

すでに「ここ」でinput要素を出力してしまっては、あとから書き替えようがありません。ブラウザ側で書き替えてもらうとすればJavaScript(の記述)を出力するとかしないとダメです。それとも「POSTされたあとで」書き替えるのでしょうか?違いますよね(「foreachのときに」という意味がわかりません)。

#ソースを読んだ限りでは「何をしたいのか」が読み取れません・・

ちなみに、str_replaceでは「すべて置換」になりますので、「ひとつずつ置換したい」のであればpreg_replaceでlimitを(1に)指定してということになるんじゃないでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1
replyergirls [7月11日 16:47]

ご返信ありがとうございます。

共通となる
<input type="text" value="ここ">
を指定します。

後は顔文字の数を数えます。
すると三つなので、foreachの処理の途中で
<input type="text" value="ここ">
<input type="text" value="ここ">
<input type="text" value="ここ">
となります。
後は、『ここ』という部分にそれぞれに合った顔文字を挿入したいのですが、無理でしょうか??
ちなみに携帯サイトなので、javascriptとかは無理です。

何番目かを判定する為にcountアップ処理で判別して、一番目の『ここ』には、一番上の顔文字を挿入
という具合に、それぞれ当てはめるのが理想です。

何がしたいかと言うと、同じ重複部分を省略して作業時間の短縮が狙いです。
今は三つの例なので、手作業でも簡単に書けますが、これが顔文字100個とかになると、どうしても面倒になります。

それならformは使わず、ただの配列

$array=array("(^v^)","(*^_^*)","(>_<)");
foreach($array as $item){
echo"<input type=\"text\" value="$item\" /><br />";
}

でやれば簡単に出来ると思いますが、今回はどうしてもformを使いたいです。
何故ならオンライン上で簡単にコードが作れるからです。

例えば、顔文字で無くてもいいです。

■:a
■:b
■:c
■:d
■:e

とかみたいに、■:の部分は同じ場合があります。
こういう時にこれをそれぞれのtextareaに入力すると、簡単に生成されます。

この例でいうと、一つ目のtextareaは
a
b
c
d
e
となります。
そして二つ目のtextareaは、
■:
となります。

この例だと■:の横にそれぞれ配置すれば、いいのでうまくいくと思いますが、<input type="text" value="ここ">のように挿入した箇所がタグとかの中に含まれていた場合は、何かて置き換え無いと考えたんでこのようになったのです。

ややこしくなりましたが、おわかりいただけましたでしょうか??
それ踏まえて、どのように解決すればいいかをご教授頂ければ幸いですm(__)m
宜しくお願い致します。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyershimix [7月11日 19:56]

>今回はどうしてもformを使いたいです。
>何故ならオンライン上で簡単にコードが作れるからです。

formからPOSTされたあと(データを受け取ってから)の話なんですよね?最初にそう書いてください。それを書かないからJavaScriptだのどうのという話になります。

#とてもじゃないけど読み取れません・・。

たとえ同じスクリプトであっても、form部分と受け取って処理する部分は分けてください(実際に別でもかわまないわけですから)。

まずは仕様を確定させます。

・$_POST['t1']の内容は「改行コードで区切って」配列に入れる($arrayとする)。
・$_POST['t2']の内容で「ここ」という文字列を先頭から順に(t1の)配列の要素で置換する。

ということでいいですか?であれば、さきほどのレスの「str_replaceでなくpreg_replaceを使う」というのが参考になると思いますが、そういうことはまだ試されてませんかね・・。


HTML部分
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
  4. <title>テスト</title>
  5. </head>
  6. <body>
  7. <form action="" method="post">
  8. 顔文字<br />
  9. <textarea name="t1" cols="20" rows="5">(^v^)
  10. (*^_^*)
  11. (>_<)</textarea><br />
  12. 共通部分指定<br />
  13. <textarea name="t2" cols="20" rows="5">
  14. <input type="text" value="ここ" />
  15. <input type="text" value="ここ" />
  16. <input type="text" value="ここ" />
  17. <input type="text" value="ここ" />
  18. </textarea><br />
  19. <input type="submit" value="決定" />
  20. </form>
  21. </body>
  22. </html>

phpスクリプト(test.php)
  1. <?php
  2. $t1 = $_POST['t1'];
  3. $t1 = str_replace("\r"''$t1);
  4. $array = explode("\n"$t1);
  5. $t2 = htmlspecialchars($_POST['t2']);
  6. if(($t1)and($t2)){
  7.     foreach($array as $item){
  8.         $t2 = preg_replace('/ここ/'$item$t21)// 第4引数がlimit(処理する数)
  9.     }
  10.     print $t2;
  11. }
  12. ?>

#$_POST['kao']というのは何のことかわからなかったので無視しています。


「ここ」という文字列を配列の数(3個)まで置換出来ていると思います。繰り返したければ「ここ」という文字列があるかどうかをチェックして(foreachのさらに外側で)Loopすればいいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyergirls [7月11日 23:23]

ご返答ありがとうございます。
わかりずらくて申し訳無いですm(__)m

教えて頂いたコードの二つ目のtextareaには、<input type="text" value="">が四つ入っておりますが、それを一つにして処理したいのですが、可能でしょうか??

四つ書いてしまうと、普通にテキストを書いた方が早いので、あんまり意味が無いです。
一番のポイントは、二つ目のtextareaには共通部分を一つ書く事です。

$_POST['kao'];
は間違えましたm(__)m

宜しくお願い申し上げます。
もう少しわかりやすそうな例にしてみました。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<title>テスト</title>
</head>
<body>
<form action="" method="post">
顔文字<br />
<textarea name="t1" cols="20" rows="5">(^v^)
(*^_^*)
(>_<)</textarea><br />
共通部分指定<br />
<textarea name="t2" cols="20" rows="5">
■:
</textarea><br />
<input type="submit" value="決定" />
</form>
</body>
</html>
<?php
$t1 = $_POST['t1'];
$t1 = str_replace("\r", '', $t1);
$array = explode("\n", $t1);
$t2 = htmlspecialchars($_POST['t2']);
if(($t1)and($t2)){
$c=0;
foreach($array as $item){
print "$t2$array[$c]<br />";
$c++;
}
}
?>

これを表示させると、

■: (^v^)
■: (*^_^*)
■: (>_<)
となります。
このように二つ目のtextareaは一つでそれぞれの値を入れたいという意味合いです。
この■:の部分を<input type="text" value="">にした時の方法がわからない感じとなります。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1
replyershimix [7月12日 06:39]

じゃぁ、

  1. <?php
  2. $t1 = $_POST['t1'];
  3. $t1 = str_replace("\r"''$t1);
  4. $array = explode("\n"$t1);
  5. $t2 = htmlspecialchars($_POST['t2']);
  6. if(($t1)and($t2)){
  7.     $out = '';
  8.     foreach($array as $item){
  9.         $out .= str_replace('ここ'$item$t2) . '<br />' . PHP_EOL;
  10.     }
  11.     print $out;
  12. }
  13. ?>

ってことですか?

#最初のソースまで書けているのにこのロジックが思い浮かばない・・というのが
#想像できなかったです(汗

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1
replyergirls [7月12日 16:04]

ご返答ありがとうございますm(__)m
お陰様で出来ました。

  1. foreach($array as $item){
  2. $out=str_replace('ここ',$item,$t2);
  3. print "$out<br />";
  4. }

これで最初試していたと記憶していたのですが、何故か出来なかったのですが、今やってみたら、出来ましたm(__)m

ところで、$out="";ってなんでしょうか??
初期化するみたいな意味合いなのでしょうか??
とあるサーバーで、未定義の変数があると、エラーになるという事を先日体験したのですが、それと関係しておりますでしょうか??

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1
replyershimix [7月12日 17:54]

>ところで、$out="";ってなんでしょうか??
>初期化するみたいな意味合いなのでしょうか??

私のソースだと、foreachの「中で」printせずに、foreachの中では$outに文字列を追加しておいてforeachを抜けてから最後にprintしています。なので(最初の項目を追加する前に)初期化していないとマズイです。実際には(言語仕様によっては)無問題かもしれませんが、初期化していない変数に追加というのは「気持ち悪い」と感じます。

#そう感じないようだと(プログラマとしては)ちょっと困ります


ちなみに。私は「最後の行には<br />が不要だから、最後に追加した<br />をforeachを抜けてから消す」ことになったら・・と考えてしまうので、いったん$outに入れて最後にprintすることが多いです(あるいは追加するときに「$outが空白じゃなかったら<br />を先に追加」とかですね)。

もちろん$outなどは使わずに
  1. foreach($array as $item){ print str_replace('ここ', $item, $t2) . '<br />'; }
でもいいです。このあたりはお好みでどうぞ。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1-1-1-1-1
replyergirls [7月13日 15:22]

ご返答ありがとうございますm(__)m

詳しく教えて頂きありがとうございました。
大変勉強になりました。

今後とも宜しくお願い申し上げます。

この意見に回答する

ツリーへ TOPへ

A02
answereryuu_a0 [7月12日 04:45] (最終編集:7月12日 04:52)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)