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

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

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

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

Q&A

解決済

4回答

1954閲覧

PHPで他サイトのソースを行指定で取得する方法

daichi-onoue

総合スコア53

PHP

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

0グッド

0クリップ

投稿2020/03/23 09:49

PHPで他サイトから、
行指定でソースを取得する方法を教えてください。
例えば、191行目~535行目です。

php

1<?PHP 2 3$URL = "https://example.com"; //取得したいサイトのURL 4 5$ch = curl_init(); 6 7//ここからオプション 8curl_setopt($ch, CURLOPT_URL, $URL); 9curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //証明書検証しない 10curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //レスポンスを表示するか 11curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //"Location: " ヘッダの内容をたどる 12curl_setopt($ch, CURLOPT_MAXREDIRS, 10); //"Location: " ヘッダの内容をたどる深さ 13//ここまでオプション 14 15$output = curl_exec($ch) or die('error ' . curl_error($ch)); //cURL セッションを実行する 16curl_close($ch); //リソースを閉じ、システムリソースを解放 17 18//日本語のための文字コード設定など 19mb_language("Japanese"); 20$html_source = mb_convert_encoding($output, "UTF-8", "auto"); 21 22echo ( $html_source ); 23?>

上記ソースで全体のソース取得はできました。
(セキュリティー面に問題があるとは思いますが、今回は割愛します。)
この状態だと、ソースのすべてがサイトに表示されてしまうため、
191行目~535行目だけを表示したいです。

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

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

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

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

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

m.ts10806

2020/03/23 09:55

目的はなにでしょうか
guest

回答4

0

ベストアンサー

以下コードでは例として改行コードをPHP_EOLとし、4行目から7行目を取得しています。
PHP_EOLexplode()してarray_slice()で必要分を抽出し、PHP_EOLimplode()しています。
それぞれ単純な物の組み合わせなのでリファレンスマニュアル見ながら解析できると思います。

php

1<?php 2$data=''; for ($i=1; $i<=10; $i++){ $data .= "line:".$i . PHP_EOL; } // make testdataを 3print_r((($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 4)) : "").PHP_EOL);

実行結果

console

1$ php test.php 2line:4 3line:5 4line:6 5line:7

投稿2020/03/23 11:22

編集2020/03/23 13:38
Y.H.

総合スコア7918

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

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

Y.H.

2020/03/23 11:24

過去質問未解決放置が多い質問者さんですね。。。
退会済みユーザー

退会済みユーザー

2020/03/23 13:23

クラサバで改行コードちがうと正常動作しないよ。
Y.H.

2020/03/23 13:27

あ、はい。質問にも改行コードが明示してなかったので、例としてPHP_EOLで回答してます。
daichi-onoue

2020/03/24 00:10

<?php $data=''; //変数dataに空欄を代入 for ($i=1; $i<=10; $i++){ $data .= "line:".$i . PHP_EOL; } // make testdataを //for文でループ処理させた$iを$dataに代入 //その際に、line: の後に表示するようにし、改行 print_r((($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 4)) : "").PHP_EOL);
daichi-onoue

2020/03/24 00:10

わかったところだけ、コメントを入れてみました。
daichi-onoue

2020/03/24 00:11

$data ? $data の?は、何故入っているのでしょうか? どのような役割なのでしょうか?
daichi-onoue

2020/03/24 00:41

ありがとうございます。 お答えいただいたソースの場合、 表示するものが数字なので、$i を計算してそのまま表示できているのだと思うのですが、 今回、私が行いたいことですと、$iの中身はソースになります。 よって、どのようにすれば解決できるのでしょうか?
Y.H.

2020/03/24 00:58 編集

一行目はcurl_exec()の戻り値を$dataにでっち上げてるだけです。$iはでっち上げる際に使用している単なるカウンター変数です。 2行目が質問に対する回答のコードでcurl_exec()の戻り値である$dataをinputとしています。 アウトプットはprint_r()の中の式の結果(文字列)ですので変数にでも入れて使用してください。
daichi-onoue

2020/03/24 00:57

ということは、総合的に考えて、 <?PHP $URL = "https://example.com"; //取得したいサイトのURL $ch = curl_init(); //ここからオプション curl_setopt($ch, CURLOPT_URL, $URL); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //証明書検証しない curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //レスポンスを表示するか curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //"Location: " ヘッダの内容をたどる curl_setopt($ch, CURLOPT_MAXREDIRS, 10); //"Location: " ヘッダの内容をたどる深さ //ここまでオプション $output = curl_exec($ch) or die('error ' . curl_error($ch)); //cURL セッションを実行する $data=$output; for ($i=1; $i<=10; $i++){ $data .= "line:".$i . PHP_EOL; } // make testdataを print_r((($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 4)) : "").PHP_EOL); curl_close($ch); //リソースを閉じ、システムリソースを解放 これで、4行目から7行目のソース取得が可能なのでしょうか?
Y.H.

2020/03/24 01:17 編集

> これで、4行目から7行目のソース取得が可能なのでしょうか? for文はcurl_exec()の戻り値を回答の為にでっちあげているだけなので不要です。 実行すると4行目から7行目がprint_r()により表示されます。 やってみてわからないところがあれば質問してください。ここで聞いて回答待つより早いですよね?
daichi-onoue

2020/03/24 01:11

ありがとうございます! 解決しました!
daichi-onoue

2020/03/24 08:45

すみません。 関連して、もう一つだけ教えてください。 print_r((($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 1)) : "").PHP_EOL); で表示させたソースを変数に代入するには、どうすればよいのでしょうか? 今回の例で言いますと、 $a のなかに、line:4 だけを代入させたいです。(ソース、一部変更して1行だけにしました。) $a = print_r((($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 1)) : "").PHP_EOL); としても、うまく代入されません。。。
Y.H.

2020/03/24 08:51 編集

print_r()は引数で与えられたものを出力します。  マニュアル見ましょう⇒https://www.php.net/manual/ja/function.print-r.php なので、print_r()するのではなく単に変数に代入すればよいだけです。
daichi-onoue

2020/03/24 08:54

ということは、 $a=(($lines=explode(PHP_EOL, $data ? $data : "")) ? implode(PHP_EOL, array_slice($lines, 3, 1)) : "").PHP_EOL; ですね? やってみます。
daichi-onoue

2020/03/24 08:56

変数に代入されました! ありがとうございます。
guest

0

191行目~535行目

改行マークの数を数えて処理すればいいでしょう

投稿2020/03/23 10:05

yambejp

総合スコア116724

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

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

0

改行コードをカウントして必要な箇所を切り出すとか、
改行コードで分割して配列に格納した後に、必要な箇所のみ出力するとか、
手はあると思うけど。

投稿2020/03/23 09:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

daichi-onoue

2020/03/24 00:18

実際に必要なソースは、<table>〜</table>の間なので、 改行コードではない処理方法はないでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/24 01:29

そういうことは要件に影響を与えるため、 質問にしっかり考慮するべき事柄として添えておくべきではないかな。
退会済みユーザー

退会済みユーザー

2020/03/24 01:31

じゃぁ、table要素を検出してからの行数をカウント(=改行コードをカウント)すればいいじゃない。 なにも、コンテンツ全部検査しなくてもやる方法はあると思うのですよ。 それか、DOM操作をXPath使ったほうが手っ取り早いケースもあったりするかもしれないけど。
退会済みユーザー

退会済みユーザー

2020/03/24 01:33

質問文から読み取れる要件として、単に行数としか書いていないから、 みんなそういう視点での回答ばかりするので、 コードを直接かけなくても、こういう考え方でやろうとしているっていう条件については、 丁寧に説明してもらわないと願った結果を得られませんよ。
guest

0

ソースコード全体の文字列を「改行コード」で分けて配列にする explode() と、0 ~ N この要素を持つ配列になります。

その配列から要素を取り出して再度「改行コード」で連結すれば、お望みの結果が得られます。

投稿2020/03/23 09:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問