PHPについての質問です。外部ファイルの一部を読み込んで表示するにはどうすればいいのでしょうか?


例えば別のURLの内容に
Hello World
とある場合Hello World全部を読み込むのではなくHelloだけを読み込んで表示させたいです。

今は下記の方法で全部読み込んで表示させてるので
一部だけ読み込んで表示させる方法をご存じの方は教えて下さい。

<?php
$file = file("http://読み込み先のURL");
foreach($file as $line){
echo($line);
}
?>

回答の条件
  • URL必須
  • 1人10回まで
  • 登録:2009/02/01 08:04:17
  • 終了:2009/02/02 19:52:15

ベストアンサー

id:tezcello No.8

tezcello回答回数459ベストアンサー獲得回数692009/02/01 15:57:11

ポイント15pt

自分のサイトのファイルの特定部分を読み込むのでしたら、僕ならこうします。

まず、「特定部分」を抜き出し易くする為に、その部分に印をつけておきます。

例えば、

...
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 はダミーです。

http://jp.php.net/manual/ja/errorfunc.configuration.php

id:wabisabi77

ありがとうございます。

そうです、それです。私がしたいのは特定部分だけ抜き出す行為です。

しかし、やはり画面が真っ白になってしまいます。

テキスト帳を開いて他には何も書かず

$str = file_get_contents('http://読み込み先のURL');

if (preg_match('!

\s*(.*)
!s', $str, $res)){

print $res[1];

}

?>

と、ちゃんと読み込み先のURLに変更して書いてtest.phpで保存してアップロード

したんですがダメでした。もちろん読み込み先のファイルに

Hello World

更新情報

2009/01/01 ここに更新情報

2008/12/31 ここに更新情報

を記帳しています。

2009/02/01 18:02:13

その他の回答(8件)

id:ls_10_5 No.1

ls_10_5回答回数91ベストアンサー獲得回数42009/02/01 08:57:18

ポイント16pt

一部を読み込んで表示させる、という状況がよく分からないので、

「『Hello World』と書いてあるファイルから各行最初の5文字を表示させる」場合としてお答えします。

最適解かは分かりませんが、私だったら以下のようにします。


<?php

$file = file("http://読み込み先のURL");

foreach($file as $line){

echo substr($line, 0, 5);

}

?>


(うまく表示されないので<>は全角にしてあります)

もう少し詳しく説明してくだされば、もっと役に立つお答えができると思います。


参考までに、Webで見られるPHPマニュアルのURLを貼っておきます。

http://www.php.net/manual/ja/index.php

id:wabisabi77

ありがとうございます。

でも、私のやり方が悪いのか教えて頂いた方法では表示されませんでした、

もう少し説明しますと私のやり方では

スタイルシートなどのメタ情報まで読み込んでしまうのです。

具体的にいいますとRSS見たいに自動で更新情報を所得して表示したいです。

他のサイトの情報じゃなくて自分のサイトの更新情報で良いんですが。

Hello World

更新情報

2009/01/01 ここに更新情報

2008/12/31 ここに更新情報

の場合

2009/01/01 ここに更新情報

2008/12/31 ここに更新情報

だけを何とかして表示したいのですが…説明分かりにくくてすみません。

2009/02/01 10:03:49
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/02/01 09:20:35

ポイント16pt

「一部」の定義が曖昧です。

たとえば、「一部」の意味が「"Hello" に一致する行」ということであれば、下記のようにします。

$file = file("http://読み込み先のURL");
$pat = "/Hello/";    //一致パターン
foreach($file as $line){
    if (preg_match($pat, $line) != 0)  echo($line);
}

一致判定のために preg_match という正規表現関数を利用しています。

正規表現については、「PHPで正規表現」を参考にして頂ければと思います。

id:wabisabi77

ありがとうございます。

プログラミング初心者なもんで何が悪いのか何も表示されませんでした。

1さんの方にもう少し詳しく回答してますので何か分かりましたら教えてください。

2009/02/01 10:10:00
id:ls_10_5 No.3

ls_10_5回答回数91ベストアンサー獲得回数42009/02/01 10:20:18

ポイント16pt

追加説明ありがとうございます。

必要な行だけ読み込む、ということは難しいので、読み込んでから表示するかを判断する、という方法でやります。

更新情報を表示したいとのことですが、更新情報を書く行の形式が決まっているなら、その形式に合わせてパターンマッチをするといいと思います。

(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文字」で始まる行を表示するようになっています。


パターンマッチはこのページを参考にしました。

http://www.php.net/manual/ja/function.preg-match.php

id:wabisabi77

ありがとうございます。

私が言いたい事とかなり近いことが出来そうな気がしたんですが

そのままコピペして使ったら画面が真っ白になってしまいました。

これの改善方法をご存じでしたら教えて下さい

2009/02/01 10:57:58
id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332009/02/01 10:36:26

ポイント16pt

入力にはスタイルシートや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" が含まれている行」ということであれば


※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。

id:wabisabi77

ありがとうございます。

こちらもコピペして使ったんですが画面は真っ白にならなかったんですが

URLから読み込みもエラーも吐かず何も変わりませんでした。

自分でコピペするくらいしかできないので何か初歩的な事で間違ってるのでしょうか?

2009/02/01 11:05:49
id:pahoo No.5

pahoo回答回数5960ベストアンサー獲得回数6332009/02/01 11:12:44

ポイント16pt

自分でコピペするくらいしかできないので何か初歩的な事で間違ってるのでしょうか?

そうだと思います。

残念ながら、ご自身でプログラムの流れについて確認するなり、エラーの原因を検討していただけないと、アドバイスのしようがありません。


URLはダミーです。 http://q.hatena.ne.jp/

id:ls_10_5 No.6

ls_10_5回答回数91ベストアンサー獲得回数42009/02/01 11:16:00

ポイント15pt

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

id:ls_10_5 No.7

ls_10_5回答回数91ベストアンサー獲得回数42009/02/01 11:31:46

ポイント15pt

ごめんなさい、訂正です。

if (preg_match("/^[\s\t]*\d{4}\/\d{2}\/\d{2}/", $line)){

が正しいです。


もしかしたら、何も表示されなかったのは文法上のエラーが発生していたからかもしれません。


preg_matchの使い方は以下で確認しました。

http://www.php.net/manual/ja/function.preg-match.php

id:wabisabi77

いろいろ試行錯誤してやりましたが一つもうまく行きませんでした。

せっかくいろいろ教えて下さってるのにすみません。

$file = file("http://読み込み先のURL");

foreach($file as $line){

echo($line);

}

?>

だと読み取ってくれるのに少し変えるだけで画面が真っ白になってしまいます。

2009/02/01 18:07:53
id:tezcello No.8

tezcello回答回数459ベストアンサー獲得回数692009/02/01 15:57:11ここでベストアンサー

ポイント15pt

自分のサイトのファイルの特定部分を読み込むのでしたら、僕ならこうします。

まず、「特定部分」を抜き出し易くする為に、その部分に印をつけておきます。

例えば、

...
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 はダミーです。

http://jp.php.net/manual/ja/errorfunc.configuration.php

id:wabisabi77

ありがとうございます。

そうです、それです。私がしたいのは特定部分だけ抜き出す行為です。

しかし、やはり画面が真っ白になってしまいます。

テキスト帳を開いて他には何も書かず

$str = file_get_contents('http://読み込み先のURL');

if (preg_match('!

\s*(.*)
!s', $str, $res)){

print $res[1];

}

?>

と、ちゃんと読み込み先のURLに変更して書いてtest.phpで保存してアップロード

したんですがダメでした。もちろん読み込み先のファイルに

Hello World

更新情報

2009/01/01 ここに更新情報

2008/12/31 ここに更新情報

を記帳しています。

2009/02/01 18:02:13
id:tezcello No.9

tezcello回答回数459ベストアンサー獲得回数692009/02/01 19:42:48

ポイント15pt

質問者さんのコメントにあるのは、ホントにそう記述したのか、回答に対するコメント欄にペーストする際にそうなったのかどちらでしょう?

以下キチンとペーストされているという前提で

開始タグ (=

それと、パターン部分に改行が入ってしまっていると予定外のものになってしまっていませんか?


> もちろん読み込み先のファイルに

> ...

> を記帳しています。

見る限り以前と変わりないようですが、前述したようにどの部分を抜き出したいのかを明確にしてください。

あるいは、どのようなタグで括ったのかを示してください。


回答しましたスクリプトだけでは失敗時に何も情報を返さないので、以下のようにしてみてください。

外部ファイルも以下のようにしてみてください。

今回の例では、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';
}
?>

コメント欄も開けておいて頂けると細かいフォローがし易いです。

http://q.hatena.ne.jp/1233443056

id:wabisabi77

あれ、なんか変になってますね。ちゃんとコピーしたのではてなの表示の方がおかしいです。

先ほど私が試した方法は外部ファイルを

<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('!

\s*(.*)
!s', $str, $res)){

print $res[1];

}

?>

で、<div id="whatsnew">から</div>の間だけを抜き取って表示させたいのですが

画面が真っ白になってしまった訳です。

9さんが教えて下さってる

<title>読み込みテストのソースファイル</title>

の、読み込みテストのソースファイルとはタイトルの事でいいのですか?

2009/02/01 20:36:19
  • id:tezcello
    > <title>読み込みテストのソースファイル</title>
    > の、読み込みテストのソースファイルとはタイトルの事でいいのですか?
    『タイトル」?
    別に何だって構いませんよ。この部分は適当に記述してください。

    > 画面が真っ白になってしまった訳です。
    何がエラーなのか切り分けましょう。
    <?php
    error_reporting(E_ALL);
    ini_set(display_errors, 1);
    $str = file_get_contents('http://読み込み先のURL');
    if ($str) print 'ok';
    ?>
    と書いて、実行してみてください。
    ok が表示されたら次のステップです。
  • id:wabisabi77
    そのままコピーして読み込み先のURLを変えたら
    ok
    とだけ表示されました。
  • id:tezcello
    では
    <?php
    error_reporting(E_ALL);
    ini_set(display_errors, 1);
    $str = file_get_contents('http://読み込み先のURL');
    if ($str) print 'read-ok';
    $ret = preg_match('!<div id="whatsnew">\s*(.*)</div>!s', $str, $res);
    if ($ret) print ' preg-ok';

    ?>
    ではどうでしょう?



  • id:wabisabi77
    read-ok
    Fatal error: Call to undefined function preg_match() in /home/私のURL/www/私のURL/1/test.php on line 6

    と表示されました。
    自分のサイトのURLが表示がされてる所は私のURLとしました。
  • id:tezcello
    preg_match() が未定義っていうメッセージですけど、そんなバカな...

    <?php
    phpinfo(INFO_MODULES);
    ?>
    だけを実行した場合の、pcre の項はどうなってます?
    うちの環境では、
    PCRE (Perl Compatible Regular Expressions) Support enabled
    となっていますけど。こういう行はありませんか?
  • id:wabisabi77
    教えて貰ったやり方をしたら
    いろいろ出てきたので表示されたサイト内をPCREで検索したんですけどヒットしませんでした。
    サーバーは専用サーバーなんですけど何かインストールや変更などが必要なのでしょうか?
    今の所は何もいじらなくてずっと使っていたのですが不自由しなかったので。
  • id:bayan
    PHPのバージョンが 4.2.0 より前とか?
    configure 時に --without-pcre-regex が指定してあるとか?

  • id:wabisabi77
    PHPのバージョンがどれなのか分かりませんが
    先ほどやった情報の中に
    Apache/2.2.10 (Unix) PHP/5.2.6 with Suhosin-Patch mod_ssl/2.2.10 OpenSSL/0.9.7m mod_apreq2-20051231/2.6.0 mod_perl/2.0.3 Perl/v5.8.7
    という表示はありました。

    configureとかは知識が足りなく全く分かりません。
  • id:tezcello
    > PHPのバージョンが 4.2.0 より前とか?
    file_get_contents() が使えているので、4.3.0 以上だと思うのですが...
    ereg() もダメなんだろうか?
    もしもOKなら、
    pre_match(...) の部分を
    ereg("<div id=\"whatsnew\">\n(.*)</div>", $str, $res)
    に変更すれば出来そうだけど?

    > configureとかは知識が足りなく全く分かりません。
    <?php
    phpinfo(INFO_GENERAL);
    ?>
    で表示出来るようです。

  • id:wabisabi77
    PCREをインストールしたら正常に表示されました。
    ありがとうございました。
  • id:tezcello
    PCRE インストール出来たんですね。
    お疲れさまでした。
  • id:ls_10_5
    PCREが入っていない可能性には気付きませんでした。
    勉強になりました。ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません