🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

1405閲覧

php 指定文字の処理

nyanryou

総合スコア20

PHP

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

0グッド

0クリップ

投稿2019/09/12 02:27

編集2019/09/12 02:50

国交省の水位データを使用したいと思い、phpでスクレイピングしました。
スクレイピングしたデータを最終的にCSVファイルにしたいと思ったのですが、時間データに日付も入っておりcsvファイルに出来ない状況です。
行いたい操作は、特定の文字を判別しその前後2列を違う配列に代入する。また、代入された値をその配列から削除する。
日付データと時間データを区別させたいです。
いい方法があれば教えていただきたいです。

13:00 14:00 15:00 16:00 17:00 19:00 20:00 21:00 22:00 23:00 09/11 01:00 02:00 03:00 04:00 05:00 07:00 08:00

$time_regular = preg_replace("/\r\n|\r|\n|\t|\s/","",$time);この部分はスクレイピング行うと、タブや改行もデータとして取れたので、それらがない一列のデータにしました。

text

113:0014:0015:0016:0017:0019:0020:0021:0022:0023:0009/1101:0002:0003:0004:0005:0007:0008:0009:0010:0011:0013:0014:0015:0016:0017:0019:0020:0021:0022:0023:0009/1201:0002:0003:0004:0005:0007:0008:0009:0010:00

str_split()を使用して、5つのデータに分割し配列に代入しました。

text

1array(41) { [0]=> string(5) "13:00" [1]=> string(5) "14:00" [2]=> string(5) "15:00" [3]=> string(5) "16:00" [4]=> string(5) "17:00" [5]=> string(5) "19:00" [6]=> string(5) "20:00" [7]=> string(5) "21:00" [8]=> string(5) "22:00" [9]=> string(5) "23:00" [10]=> string(5) "09/11" [11]=> string(5) "01:00" [12]=> string(5) "02:00" [13]=> string(5) "03:00" [14]=> string(5) "04:00" [15]=> string(5) "05:00" [16]=> string(5) "07:00" [17]=> string(5) "08:00" [18]=> string(5) "09:00" [19]=> string(5) "10:00" [20]=> string(5) "11:00" [21]=> string(5) "13:00" [22]=> string(5) "14:00" [23]=> string(5) "15:00" [24]=> string(5) "16:00" [25]=> string(5) "17:00" [26]=> string(5) "19:00" [27]=> string(5) "20:00" [28]=> string(5) "21:00" [29]=> string(5) "22:00" [30]=> string(5) "23:00" [31]=> string(5) "09/12" [32]=> string(5) "01:00" [33]=> string(5) "02:00" [34]=> string(5) "03:00" [35]=> string(5) "04:00" [36]=> string(5) "05:00" [37]=> string(5) "07:00" [38]=> string(5) "08:00" [39]=> string(5) "09:00" [40]=> string(5) "10:00" } string(1) " "

しかし、データ内に時間だけでなく日付データも入っておるため、 if ( strpos( $time_array[$i], '/') === false )この部分で/がある値を探して、あった場合は違う配列に入れて日付と時間を分離させようとしています。また、日付と時刻を対応させるために' 'を行っていますが、上のテキストファイルの状態になります。

php

1<?php 2 //webスクレイピング 3 require_once("./phpQuery-onefile.php"); 4 $html = file_get_contents("http://www.river.go.jp/kawabou/ipSuiiKobetu.do?obsrvId=0921700400080&gamenId=01-1003&stgGrpKind=survForeKjExpl&fldCtlParty=no&fvrt=yes"); 5 $doc = phpQuery::newDocument($html); 6 $time = $doc[".tb1td1RightNoUline"]->text(); 7 $water = $doc[".tb1td2RightNoUline"]->text(); 8 9 //正規表現 置換 10 $time_regular = preg_replace("/\\r\\n|\\r|\\n|\t|\s/","",$time); 11 $time_array = str_split($time_regular, 5); 12 $time_count = count($time_array); 13 $month = array(); 14 15 for($i=0;$i<$time_count;$i++){ 16 if ( strpos( $time_array[$i], '/') === false ){ 17 18 $month = ' '; 19 } else { 20 $month = $time_array[$i]; 21 } 22 } 23 var_dump($time_array); 24 var_dump($month); 25 // $textfile = fopen("hoge.txt","w+"); 26 // fwrite($textfile, $arrPregSplit); 27 // fclose($textfile); 28?>

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

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

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

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

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

guest

回答2

0

一応注意より

サーバに過度な負担をかけるツール等による定期的なデータ

収集は、お控えいただきますようお願いいたします

とのことです。
なんともいえませんがスクレイピングは許可されていないと解釈できます。

投稿2019/09/12 02:39

yambejp

総合スコア116694

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

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

nyanryou

2019/09/12 05:08

注意確認しました。ありがとうございます。スクレピングするときは、よく確認するようにこころがけます。
guest

0

ベストアンサー

それらがない一列のデータにしました。

この文字列を、時間と日付それぞれに分けて、それぞれをstr_splitで配列にするのではどうでしょう。

php

1<?php 2$str="13:0014:0015:0016:0017:0019:0020:0021:0022:0023:0009/1101:0002:0003:0004:0005:0007:0008:0009:0010:0011:0013:0014:0015:0016:0017:0019:0020:0021:0022:0023:0009/1201:0002:0003:0004:0005:0007:0008:0009:0010:00"; 3$timestr = preg_replace('/[0-9][0-9]/[0-9][0-9]/',"",$str); 4$datestr = preg_replace('/[0-9][0-9]:[0-9][0-9]/',"",$str); 5var_dump($timestr); 6var_dump($datestr); 7var_dump(str_split($timestr, 5)); 8var_dump(str_split($datestr, 5));

実行結果

bash

1string(195) "13:0014:0015:0016:0017:0019:0020:0021:0022:0023:0001:0002:0003:0004:0005:0007:0008:0009:0010:0011:0013:0014:0015:0016:0017:0019:0020:0021:0022:0023:0001:0002:0003:0004:0005:0007:0008:0009:0010:00" 2string(10) "09/1109/12" 3array(39) { 4 [0]=> 5 string(5) "13:00" 6 [1]=> 7 string(5) "14:00" 8 [2]=> 9 string(5) "15:00" 10・・・略・・・ 11 string(5) "08:00" 12 [37]=> 13 string(5) "09:00" 14 [38]=> 15 string(5) "10:00" 16} 17array(2) { 18 [0]=> 19 string(5) "09/11" 20 [1]=> 21 string(5) "09/12" 22}

投稿2019/09/12 02:56

編集2019/09/12 05:18
Y.H.

総合スコア7918

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

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

nyanryou

2019/09/12 18:46

ありがとうございます。そのような方法は思いつきませんでした。助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問