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

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

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

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

Q&A

解決済

1回答

1903閲覧

phpのforeach文での文字列置換

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2021/05/03 00:20

編集2021/05/03 06:21

前提・実現したいこと

フォームから受け取ったデータをテンプレート用に用意したファイル(org.php)を利用し、foreachを利用してstr_replace しようと思ったのですがデータが複数ある場合、初めの1つのみの置換になってしまいます。
全てのデータを置換するにはどうすればいいでしょうか?
ちなみに、fwrite()で直接書こうとしましたが、そちらもやり方がよくわかりませんでした。
$_POST['title'][$key].$_POST['desc'][$key].$_FILES['file']['name'][$key]はなるべくひとまとまりにしたいです。

発生している問題・エラーメッセージ

エラーメッセージ 特になし。

該当のソースコード

php

1 2 //書き込みオリジナルファイル読み込み 3$files=file_get_contents('org.php'); 4 5 //'a'+乱数を生成してファイル名に 6$fileName = "file/admin/".htmlspecialchars($_POST['main'],ENT_QUOTES).rand( 1000000, 9999999) .date("Ymd"); 7 8//書き込みオリジナルファイルから変更点を置き換える 9$files=str_replace("たいとる",htmlspecialchars($_POST['main'],ENT_QUOTES),$files); 10$files=str_replace("disciptions",htmlspecialchars($_POST['main'],ENT_QUOTES),$files); 11$files=str_replace("説明",htmlspecialchars($_POST['comment'],ENT_QUOTES),$files); 12foreach($_POST['title'] as $key=>$title) 13 { 14$files=str_replace("ファイル",$_POST['title'][$key].$_POST['desc'][$key].$_FILES['file']['name'][$key].'</br>',$files); 15 } 16 /* 17$files=str_replace("ファイル",htmlspecialchars($_FILES['file']['name'][0],ENT_QUOTES),$files); 18*/ 19 20//文字コードをUTFに変換 21$files = mb_convert_encoding($files, "UTF-8","AUTO"); 22 23//ファイル名に拡張子を付ける 24$fileName = $fileName. ".php"; 25 26//ファイル生成&書き込み 27$handle = fopen($fileName, 'w'); 28 29fwrite( $handle, $files); 30fclose( $handle ); 31 32// メッセージ表示 33print $fileName. "を生成しました。<br/>\n"; 34 35 36print '<a href="'.$fileName.'">'.$fileName. '</a>'."をのリンク。<br/>\n"; 37 38var_dump($_POST['title'],$_POST['desc'],$_FILES['file']['name']);

php

1org.php 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <title>たいとる</title> 7 8 9</head> 10<style> 11 12</style> 13<body> 14<a href="https://teratail.com/questions/14413">参考</a> 15 16 <h1>たいとるについて</h1> 17 <p>説明</p> 18 19 <p>ファイル</p> 20 21</body> 22</html>

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

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

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

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

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

m.ts10806

2021/05/03 00:38

org.php の内容とか POSTを送る側でどう入力してるかとか(そのコードとか)ないと何とも言えないかと。 一般的に.phpの内容だけをそのまま読み込むことってないですし。
退会済みユーザー

退会済みユーザー

2021/05/03 01:26

すみません。 更新いたしました。 よろしくお願いします。
m.ts10806

2021/05/03 01:32

file_get_contentsで読み込むと内部のincludeとかは実行されないはずですが、どういう意図で使ってますか?
退会済みユーザー

退会済みユーザー

2021/05/03 01:44

すみません。 インクルード等はリセットcss等を格納しておりました。 使い回しであってあまり意図はありません。
guest

回答1

0

ベストアンサー

foreachを利用してstr_replace しようと思ったのですがデータが複数ある場合、初めの1つのみの置換になってしまいます。

単純に考えると、原因は、foreachループの1周目で"ファイル"が置換されてしまうからだと思います。2周目以降は、もう$filesには"ファイル"が含まれてないので置換も起きないですよね。

まず複数の置換先を文字列連結してから、1度だけ置換する、というのが、本来の意図では?
元のコードを尊重しつつ書くと↓こんな感じになると思います。

php

1$replacements = []; 2foreach($_POST['title'] as $key=>$title) 3 { 4$replacements[] = $_POST['title'][$key].$_POST['desc'][$key].$_FILES['file']['name'][$key]; 5 } 6$files=str_replace("ファイル", implode('<br>', $replacements));

[追記(訂正)]

エラーを起こしたので、最後に$failsを追加しておきました。

失礼しました。引数が足りなかったですね。

php

1$files=str_replace("ファイル", implode('<br>', $replacements), $files);

投稿2021/05/03 01:48

編集2021/05/03 09:57
gpsoft

総合スコア1323

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

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

退会済みユーザー

退会済みユーザー

2021/05/03 06:23

ありがとうございました。 細かいですがstr_replaceの引数が"ファイル", implode('<br>', $replacements) だったのでエラーを起こしたので、最後に$failsを追加しておきました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問