PHPスクリプトを使用して、いくつかのWebページをテキストファイルに保存しようとしています。
PHPを使用してWebページをファイルバッファにロードし、HTMLタグを削除するにはどうすればよいですか?
fopen()
または- file_get_contents()
URL:fopen("http://google.com/", "r")
http_get()
PHPの http
モジュールからfsockopen()
または stream_socket_client()
wget
やcurl
などの外部ツールをsystem()
から呼び出すただし、これらのいずれもサーバーで使用できることが保証されていません。
一方通行:
$url = "http://www.brothersoft.com/publisher/xtracomponents.html";
$page = file_get_contents($url);
$outfile = "xtracomponents.html";
file_put_contents($outfile, $page);
上記のコードは単なる例であり、(!)エラーのチェックと処理が欠けています。
他の答えが言ったように、標準のPHPストリーム関数またはcURLがHTMLを取得するための最善の策です。タグを削除することに関して、ここにいくつかのアプローチがあります:
オプション#1:サーバーで利用可能な場合はTidy拡張機能を使用して、ドキュメントツリーを再帰的にウォークスルーし、ノードからテキストを返します。このようなもの:
function textFromHtml(TidyNode $node) {
if ($node->isText()) {
return $node->value;
} else if ($node->hasChildren()) {
$childText = '';
foreach ($node->child as $child)
$childText .= textFromHtml($child);
return $childText;
}
return '';
}
たとえば、<br />
タグ($node->name == 'br'
)を改行に置き換えるなど、それよりも洗練されたものが必要になる場合がありますが、これは最初から役立ちます。
次に、HTMLのテキストをTidyオブジェクトに読み込み、bodyノードで関数を呼び出します。文字列の内容がある場合は、次を使用します。
$tidy = new tidy();
$tidy->parseString($contents);
$text = textFromHtml($tidy->body());
オプション#2:正規表現を使用して、<
と>
の間のすべてを削除します。たとえば、有効なHTMLの開始タグまたは終了タグのみに一致する、より洗練された正規表現を開発できます(おそらくそうすべきです)。ページのシナックスにエラーがある場合(本文の角かっこなど)、注意しないとゴミが出力される可能性があります。これがTidyがとても素敵な理由です(悪いページをクリーンアップするように特別に設計されています)が、利用できない場合があります。
SimpleHTML DOMクラスをご覧になることを強くお勧めします。
SourceForgeのSimpleHTML DOMパーサー
これを使用すると、jQueryの$()関数やprototypeJS $$()関数と同様に、cssセレクターを使用してDOMツリーを検索できます。
File_get_contents()と連携してWebページのコンテンツを取得しますが、HTMLを渡すことができるのは、一部のcURLクラス(ログインなどが必要な場合)のみです。