例えば別のURLの内容に
Hello World
とある場合Hello World全部を読み込むのではなくHelloだけを読み込んで表示させたいです。
今は下記の方法で全部読み込んで表示させてるので
一部だけ読み込んで表示させる方法をご存じの方は教えて下さい。
<?php
$file = file("http://読み込み先のURL");
foreach($file as $line){
echo($line);
}
?>
自分のサイトのファイルの特定部分を読み込むのでしたら、僕ならこうします。
まず、「特定部分」を抜き出し易くする為に、その部分に印をつけておきます。
例えば、
... Hello World 更新情報 <div id="whatsnew"> 2009/01/01 ここに更新情報<br> 2008/12/31 ここに更新情報<br> </div> ...
のように外部ファイルに仕込みを入れておいて、
$str = file_get_contents('http://読み込み先のURL'); if (preg_match('!<div id="whatsnew">\s*(.*)</div>!s', $str, $res)){ print $res[1]; }
こんな感じで。
div タグを使っていますが、p タグでも構いません。
id 属性を使って見つけ出そうとしていますが、class 属性でも同様に出来ます。
(id は同じ id 値を複数回使う事ができませんが、class は可能です。)
div, p などブロック要素の場合は、表示時に前後に改行が入ってしまうのでそれを
スタイルシートで体裁を整えるようにするのも可能でしょう。
それが不都合なら、
2009/01/01 ここに更新情報
2008/12/311 ここに更新情報
のようにしておいて、... の...部分を抜き出すとか。
どの方法をとるにしても、外部ファイルを読み込み必要な部分を取り出すには、どの部分が必要な部分かを明確にしてかないと不可能に近いです。
例えば、
・Hello World の次から2行だけ
・Hello World 以降の、日付で始まる行全部
のように。
それが決まれば、どのように取り出すかは自然と決まります。
(上で回答として示したのは、タグで必要な部分を括るー>その部分を抜き出すという事です。)
> 画面が真っ白
は、致命的なエラーがあった為でしょう。
本当にコピペしただけなら、先頭と末尾が全角文字なので、そのせいとか?
URL はダミーです。
一部を読み込んで表示させる、という状況がよく分からないので、
「『Hello World』と書いてあるファイルから各行最初の5文字を表示させる」場合としてお答えします。
最適解かは分かりませんが、私だったら以下のようにします。
<?php
$file = file("http://読み込み先のURL");
foreach($file as $line){
echo substr($line, 0, 5);
}
?>
(うまく表示されないので<>は全角にしてあります)
もう少し詳しく説明してくだされば、もっと役に立つお答えができると思います。
参考までに、Webで見られるPHPマニュアルのURLを貼っておきます。
ありがとうございます。
でも、私のやり方が悪いのか教えて頂いた方法では表示されませんでした、
もう少し説明しますと私のやり方では
スタイルシートなどのメタ情報まで読み込んでしまうのです。
具体的にいいますとRSS見たいに自動で更新情報を所得して表示したいです。
他のサイトの情報じゃなくて自分のサイトの更新情報で良いんですが。
Hello World
更新情報
2009/01/01 ここに更新情報
2008/12/31 ここに更新情報
の場合
2009/01/01 ここに更新情報
2008/12/31 ここに更新情報
だけを何とかして表示したいのですが…説明分かりにくくてすみません。
「一部」の定義が曖昧です。
たとえば、「一部」の意味が「"Hello" に一致する行」ということであれば、下記のようにします。
$file = file("http://読み込み先のURL"); $pat = "/Hello/"; //一致パターン foreach($file as $line){ if (preg_match($pat, $line) != 0) echo($line); }
一致判定のために preg_match という正規表現関数を利用しています。
正規表現については、「PHPで正規表現」を参考にして頂ければと思います。
ありがとうございます。
プログラミング初心者なもんで何が悪いのか何も表示されませんでした。
1さんの方にもう少し詳しく回答してますので何か分かりましたら教えてください。
追加説明ありがとうございます。
必要な行だけ読み込む、ということは難しいので、読み込んでから表示するかを判断する、という方法でやります。
更新情報を表示したいとのことですが、更新情報を書く行の形式が決まっているなら、その形式に合わせてパターンマッチをするといいと思います。
(2番目の方の答えと同じですね)
<?php
$file = file("http://読み込み先のURL");
foreach($file as $line){
if (preg_match(/^\d{4}\/\d{2}\/\d{2}/, $line)){
echo($line);
}
}
?>
この例では、「数字4文字 / 数字2文字 / 数字2文字」で始まる行を表示するようになっています。
パターンマッチはこのページを参考にしました。
ありがとうございます。
私が言いたい事とかなり近いことが出来そうな気がしたんですが
そのままコピペして使ったら画面が真っ白になってしまいました。
これの改善方法をご存じでしたら教えて下さい
入力にはスタイルシートやHTMLタグが含まれているということですね。
であれば、比較する前にstrip_tags関数でタグを取り除いておきましょう。
$file = file("http://読み込み先のURL"); $pat = "/\d{4}\/\d{2}\/\d{2}(.*)/"; //一致パターン foreach($file as $line){ $instr = strip_tags($line); //HTMLタグを取り除く if (preg_match($pat, $instr, $arr) != 0) echo($arr[1]); }
上記は、更新内容のみを表示する場合です。
年月日も含めて1行分を表示したいのであれば、最後の行のif 文の後を
echo($arr[0])
に置き換えてください。
#2の回答の訂正をします。日本語が間違っていました。
×「一部」の意味が「"Hello" に一致する行」ということであれば
○「一部」の意味が「"Hello" が含まれている行」ということであれば
※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。
ありがとうございます。
こちらもコピペして使ったんですが画面は真っ白にならなかったんですが
URLから読み込みもエラーも吐かず何も変わりませんでした。
自分でコピペするくらいしかできないので何か初歩的な事で間違ってるのでしょうか?
自分でコピペするくらいしかできないので何か初歩的な事で間違ってるのでしょうか?
そうだと思います。
残念ながら、ご自身でプログラムの流れについて確認するなり、エラーの原因を検討していただけないと、アドバイスのしようがありません。
URLはダミーです。 http://q.hatena.ne.jp/
1,3の回答者です。
真っ白になってしまうというのは、パターンマッチがうまく行かず、何もマッチしない、という結果になっているためだと思います。
考えつく可能性の一つは、更新情報の書かれている行の先頭に空白があることでしょうか。
その場合、
if (preg_match(/^[\s\t]*\d{4}\/\d{2}\/\d{2}/, $line)){
としてみてください。
此方でもテストしてみたいので、実際に読み込んでいらっしゃるファイルの更新情報の部分だけでも、見せて頂けないでしょうか?
更新内容の部分は適当に書き換えて頂いて構いません。
URLが必須なので、PHPを解説しているサイトのパターンマッチのページを紹介しておきます。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/php_k09.htm
ごめんなさい、訂正です。
if (preg_match("/^[\s\t]*\d{4}\/\d{2}\/\d{2}/", $line)){
が正しいです。
もしかしたら、何も表示されなかったのは文法上のエラーが発生していたからかもしれません。
preg_matchの使い方は以下で確認しました。
いろいろ試行錯誤してやりましたが一つもうまく行きませんでした。
せっかくいろいろ教えて下さってるのにすみません。
$file = file("http://読み込み先のURL");
foreach($file as $line){
echo($line);
}
?>
だと読み取ってくれるのに少し変えるだけで画面が真っ白になってしまいます。
自分のサイトのファイルの特定部分を読み込むのでしたら、僕ならこうします。
まず、「特定部分」を抜き出し易くする為に、その部分に印をつけておきます。
例えば、
... Hello World 更新情報 <div id="whatsnew"> 2009/01/01 ここに更新情報<br> 2008/12/31 ここに更新情報<br> </div> ...
のように外部ファイルに仕込みを入れておいて、
$str = file_get_contents('http://読み込み先のURL'); if (preg_match('!<div id="whatsnew">\s*(.*)</div>!s', $str, $res)){ print $res[1]; }
こんな感じで。
div タグを使っていますが、p タグでも構いません。
id 属性を使って見つけ出そうとしていますが、class 属性でも同様に出来ます。
(id は同じ id 値を複数回使う事ができませんが、class は可能です。)
div, p などブロック要素の場合は、表示時に前後に改行が入ってしまうのでそれを
スタイルシートで体裁を整えるようにするのも可能でしょう。
それが不都合なら、
2009/01/01 ここに更新情報
2008/12/311 ここに更新情報
のようにしておいて、... の...部分を抜き出すとか。
どの方法をとるにしても、外部ファイルを読み込み必要な部分を取り出すには、どの部分が必要な部分かを明確にしてかないと不可能に近いです。
例えば、
・Hello World の次から2行だけ
・Hello World 以降の、日付で始まる行全部
のように。
それが決まれば、どのように取り出すかは自然と決まります。
(上で回答として示したのは、タグで必要な部分を括るー>その部分を抜き出すという事です。)
> 画面が真っ白
は、致命的なエラーがあった為でしょう。
本当にコピペしただけなら、先頭と末尾が全角文字なので、そのせいとか?
URL はダミーです。
ありがとうございます。
そうです、それです。私がしたいのは特定部分だけ抜き出す行為です。
しかし、やはり画面が真っ白になってしまいます。
テキスト帳を開いて他には何も書かず
$str = file_get_contents('http://読み込み先のURL');
if (preg_match('!
print $res[1];
}
?>
と、ちゃんと読み込み先のURLに変更して書いてtest.phpで保存してアップロード
したんですがダメでした。もちろん読み込み先のファイルに
Hello World
更新情報
2009/01/01 ここに更新情報
2008/12/31 ここに更新情報
を記帳しています。
質問者さんのコメントにあるのは、ホントにそう記述したのか、回答に対するコメント欄にペーストする際にそうなったのかどちらでしょう?
以下キチンとペーストされているという前提で
開始タグ (=
それと、パターン部分に改行が入ってしまっていると予定外のものになってしまっていませんか?
> もちろん読み込み先のファイルに
> ...
> を記帳しています。
見る限り以前と変わりないようですが、前述したようにどの部分を抜き出したいのかを明確にしてください。
あるいは、どのようなタグで括ったのかを示してください。
回答しましたスクリプトだけでは失敗時に何も情報を返さないので、以下のようにしてみてください。
外部ファイルも以下のようにしてみてください。
今回の例では、Hello World (改行) 更新情報 (改行) のあとの2行を抜き出す事にしています。
これについては抜き出す部分の記述が変われば、それに合わせて変える必要があります。
ソースとなる外部ファイルを <html> <head> <titel>読み込みテストのソースファイル</title> </head> <body> Hello World 更新情報 2009/01/01 ここに更新情報 2008/12/31 ここに更新情報 </body> </html> スクリプトは <?php $str = file_get_contents('http://読み込み先のURL'); if (preg_match('!Hello World¥n更新情報¥n((.*)¥n(.*)¥n)!', $str, $res)){ print $res[1]; }else{ print 'failed'; } ?>
コメント欄も開けておいて頂けると細かいフォローがし易いです。
あれ、なんか変になってますね。ちゃんとコピーしたのではてなの表示の方がおかしいです。
先ほど私が試した方法は外部ファイルを
<html>
<head>
<title>タイトル</title>
</head>
<body>
Hello World
更新情報
<div id="whatsnew">
2009/01/01 ここに更新情報
2008/12/31 ここに更新情報
</div>
</body>
</html>
スクリプトは
<?
$str = file_get_contents('http://読み込み先のURL');
if (preg_match('!
print $res[1];
}
?>
で、<div id="whatsnew">から</div>の間だけを抜き取って表示させたいのですが
画面が真っ白になってしまった訳です。
9さんが教えて下さってる
<title>読み込みテストのソースファイル</title>
の、読み込みテストのソースファイルとはタイトルの事でいいのですか?
ありがとうございます。
そうです、それです。私がしたいのは特定部分だけ抜き出す行為です。
しかし、やはり画面が真っ白になってしまいます。
テキスト帳を開いて他には何も書かず
$str = file_get_contents('http://読み込み先のURL');
if (preg_match('!
print $res[1];
}
?>
と、ちゃんと読み込み先のURLに変更して書いてtest.phpで保存してアップロード
したんですがダメでした。もちろん読み込み先のファイルに
Hello World
更新情報
2009/01/01 ここに更新情報
2008/12/31 ここに更新情報
を記帳しています。