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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2021閲覧

配列化されたURLリストをforeachで回して中身を取得して書き出したい

Webtuuuu

総合スコア30

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/05/31 02:04

編集2019/05/31 03:25

###実現したいこと
①HTML内にあるリスト(URL文字列が入ってる)を配列で取得
②配列データをajaxでPHPに送信
③PHP側で、受け取った配列分回して一つずつ同じ階層に指定したファイル名でファイルを作成
④作成されたファイルに、URL先のファイル中身をstr_replaceをしてから差し込む

問題は④で起きています。
###問題のコード

HTML

1<ul class="list"> 2 <li>http://testtesttets.jp/hoge01/huga/yymmdd.html</li> 3 <li>http://testtesttets.jp/hoge02/huga/yymmdd.html</li> 4 <li>http://testtesttets.jp/hoge03/huga/yymmdd.html</li> 5 <li>http://testtesttets.jp/hoge04/huga/yymmdd.html</li> 6 <li>http://testtesttets.jp/hoge05/huga/yymmdd.html</li> 7</ul>

js

1//li表示されたものを配列化 2var listData = $('.list li').map(function () { 3 //フルパスを相対パスに置換 4 return $(this).text().replace('http://testtesttets.jp', '../..'); 5}).get(); 6console.table(listData); 7 8//更新情報 9var data = { 10 'listData': listData //配列化されたURLリスト 11}; 12 13//ajax 14$.ajax({ 15 url: 'form.php', 16 type: 'POST', 17 data: data, 18 success: function (data) { 19 console.log(data); 20 }, 21 error: function (data) { 22 alert("ajax送信エラー") 23 } 24});

PHP

1$directory_path = $_POST['listData']; //URLが配列で入ってるデータ 2$boforeText = 'アハハ'; //書き換える前のテキスト 3$afterText = 'ウフフ'; //書き換え後のテキスト 4$updated_date = '190101'; //更新日 5$updated_date = $updated_date.'.html'; //更新ファイル名 6 7//foreachはfor文のように繰り返す命令 8foreach($directory_path as $directory_path){ //$directory_pathの先頭から1つずつ$directory_pathに代入する 9 10 $pathData = pathinfo($directory_path); 11 //書き込み先ファイル名 12 $writing_file = $pathData["dirname"].'/'; 13 14 $content = file_get_contents($directory_path); //コードを取得 15 $replace = str_replace($boforeText, $afterText, $content); //取得したコードの「アハハ」を「ウフフ」に置換 16 file_put_contents($writing_file.$updated_date, $replace); //作成・又は上書き 17 18 echo $directory_path; //console.logで見る用 19}

$directory_pathをconsoleで確認するときちんとすべてのURLリストが受け取れていて、190101.htmlという名前のファイルの狙った階層にきちんと作成もされています。

ただ、コードの中身だけが取得・差し込みができておらず原因がわからないためご教示いただければと思います。

###追記
実際サーバー内にあるファイル名は「yymmdd.html」ではありません。あくまでダミーです。
例えば、
/hoge01/huga/という階層には170501.htmlというファイルがあったり
/hoge02/huga/という階層には180910.htmlというファイルがあったり
/hoge03/huga/という階層には151011.htmlというファイルがあったりします

この階層、またファイルが多数存在しており、

<li>タグではそのサーバー内に存在するファイルをいくつか指定するものです。 ※この<li>タグに入るURLは変動します。

/hoge01/huga/にある170501.htmlのコードを<li>で指定し、
そのコードを持ってくる。
持ってきたものを別のファイル名として同一階層に書き出し
といった流れを再現しようとしています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$contentをechoすると何が返ってきますか?(consoleで確認できるはず)
file_get_contents()は失敗したときはfalseなので、データが正しく取れてないのではないかと思われます。
念のためpathinfo()の前でfile_exists()で存在確認してみてください。

あとあまり影響はないかもしれませんが

foreach($directory_path as $directory_path){

同じ変数名をループで渡すのはよろしくないです。

$updated_date = $updated_date.'.html'; //更新ファイル名

複数書き込み対象があるようなので、はじめはファイル名は個別のほうが良いですね。
もし最後の手前のデータまで正常に取得できていたとしても、最後のデータがとれていなければ空になります。
デバッグ兼ねて、ループできている文字列を含めてfile_put_contents()の第3引数にFILE_APPENDをつけておくと「どこまでできているか」の問題切り分けが可能になります。

デバッグコードを入れた例:

php

1$directory_paths = $_POST['listData']; 2$boforeText = 'アハハ'; 3$afterText = 'ウフフ'; 4$updated_date = '190101'; 5foreach($directory_paths as $index=>$path){ 6 if(!file_exists($path)){ 7 echo $path.": not exists.".PHP_EOL; 8 }else{ 9 echo $path.": exists.".PHP_EOL; 10 $pathData = pathinfo($path); 11 //書き込み先ファイル名 12 $writing_file = $pathData["dirname"].'/'.$updated_date.'_'.$index.'.html'; 13 14 $content = file_get_contents($path); 15 if(!$content){ 16 echo $path.": can not get the content.".PHP_EOL; 17 }else{ 18 echo $path.": can get the content.".PHP_EOL; 19 $replace = str_replace($boforeText, $afterText, $content); 20 file_put_contents($path.PHP_EOL.$writing_file, $replace); 21 22 } 23 } 24}

投稿2019/05/31 02:21

編集2019/05/31 02:30
m.ts10806

総合スコア80850

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

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

Webtuuuu

2019/05/31 02:53

$contentをechoした結果何も帰ってきませんでした(空でした) また、記載いただいた「デバッグコードを入れた例」を丸っとお借りして試してみました。 コンソールは以下のようになりました。 ../../hoge01/huga/190101.html: not exists. ../../hoge02/huga/190101.html: not exists. ../../hoge03/huga/190101.html: not exists. ../../hoge04/huga/190101.html: not exists. . . .
m.ts10806

2019/05/31 02:54

はい。つまりパスが間違っているということになりそうですね。 phpが動作しているサーバー内に存在しているんですよね?
Webtuuuu

2019/05/31 03:06

そうですね…サーバー内です。 ただ、「パスが間違っている」ということはない気がします…。 例えば、以下の /hoge01/huga/yymmdd.html を $content = file_get_contents($directory_paths); //コードを取得 で取得はできていませんでしたが、 以下の file_put_contents($writing_file.$updated_date, $replace); //作成・又は上書き で中身が書き込まれていないだけでファイルは作成されていました。 なので実行後は /hoge01の中は ・/hoge01/huga/yymmdd.html ・/hoge01/huga/190101.html 上記のようになります。 /hoge02以降も同様です。 /hoge01/huga/の中に190101.htmlのファイルが書き出せているということは 狙った場所に作成できているのでパスはあっているのではないでしょうか?
m.ts10806

2019/05/31 03:13

yymmdd.html ←これは実際にそういうファイル名ですか?それとも実際は190531.htmlですか? 情報が混乱してしまうので何かしらの補足は欲しいです。 私としては、 <li>http://testtesttets.jp/hoge01/huga/yymmdd.html</li> <li>http://testtesttets.jp/hoge02/huga/yymmdd.html</li> というHTMLなのに ../../hoge01/huga/190101.html: not exists. ../../hoge02/huga/190101.html: not exists. という風になるのが謎に思っています。 それに not existsと出力された時点でファイルを作る処理はしないので・・・ 念のため「$pathData」も同じように出力してデバッグ確認されたほうが良いかもしれませんね。
Webtuuuu

2019/05/31 03:26

情報が不足しておりすいません。 質問最下部に追記しました。 追記した通りですが、実際はyymmddではありません。
takasima20

2019/05/31 03:49

glob($pathData["dirname"]) でファイル一覧ひろって ほんとに指定したファイルがあるか確認してみたら?
m.ts10806

2019/05/31 03:52

takasima20さんの確認方法は有用だと思います。 !file_existsで引っかかっている以上はパスが合っていないことは確かなので、 例えば不要な文字列が入り込んでないかとか(空白とか何か記号とか) そのあたりがキーになってきそうに思います。 あと、パスの指定の仕方ですかね。 ../../hoge01/huga/190101.html ではなく ./../../hoge01/huga/190101.html となるようにJavaScript側で調整してみるとか。
Webtuuuu

2019/05/31 04:32

原因が判明しました。 原因はスペースです。 <li>URL文字列(ここにスペースが入っていた)</li> この<li>タグはもともと空になっていて、 以下のようにtextareaに入力された値をliに表示していました。 <textarea> http://testtesttets.jp/hoge01/huga/yymmdd.html http://testtesttets.jp/hoge02/huga/yymmdd.html http://testtesttets.jp/hoge03/huga/yymmdd.html </textarea> このtextareaに入力されたタイミングで末尾にスペースが入っており、 スペースを削除する処理を入れていなかったためにデータを取得できていなかったものと思われます。 js側でスペースを削除してからPHPに渡したところ無事取得されました。 お騒がせ致しました…。 解決とさせていただきます…。 ありがとうございました。
m.ts10806

2019/05/31 04:34

なるほど。phpで対応する場合はtrim()も入れておいたほうがいいかもしれませんね。 pathinfo()はそのあたりをうまく切り取ってやってくれてる優秀な関数ということに・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問