PHPで外部HTMLから指定した文字列(タグ)だけを取り出してみる。
PHP初心者なので初めての事だらけでさっぱりですが、
PHPを使って外部htmlから文字列を抜き出し、
配列に入れるということをやってみた。
■はまった箇所
・外部htmlソースを引っ張ってくる。
・ソースのあるタグだけ引っ張ってくる。
titleタグを引っ張ってくるのは直ぐに出来たのですが、 htmlソース内に複数の
如何せん正規表現が調べても調べてもイマイチよくわからなくて、
preg_match('/<h2 class=\"leadContentTitle\">(.*)<\/h2>/i',$line, $match);とか
preg_match_all関数とか,ereg関数とか色々やってみたんですが、
5時間くらい悩んだあげく、自分の望んでいるものが取得できなかった。
そこで、一度DOMにしたら、もしかしていけるんじゃないかと思い、
調べていたら、
PHP Simple HTML DOM Parser
という優れものがありました!!
上記のサイトからsimplehtmldomのソースをダウンロードしてきて
フォルダ内のsimple_html_dom.phpをサーバーにいれます。
んで、phpで
RSS以外のものでも、Flashにデータを送れることを今回勉強してわかった。
このやり方が正しいのかはわかりませんけど。。。
多分おかしい。でも動いてるから・・・
PHPを使って外部htmlから文字列を抜き出し、
配列に入れるということをやってみた。
■はまった箇所
・外部htmlソースを引っ張ってくる。
//外部URL
$fp = fopen("URL","r");
while(!feof($fp)){
//html全文ゲット
$line = fgets($fp,1024);
//各行を配列に入れる
$li_array[] = $line;
}
//配列を一つの文字列に変換
$li_text = implode("", $li_array);
//外部ソースをそのまま表示。
echo $li_text;
$fp = fopen("URL","r");
while(!feof($fp)){
//html全文ゲット
$line = fgets($fp,1024);
//各行を配列に入れる
$li_array[] = $line;
}
//配列を一つの文字列に変換
$li_text = implode("", $li_array);
//外部ソースをそのまま表示。
echo $li_text;
・ソースのあるタグだけ引っ張ってくる。
//preg_match関数で、正規表現というものをつかって、titleタグだけ抜き出す。
preg_match('/<title>(.+)<\/title>/',$li_text,$match);
echo $match[1];
preg_match('/<title>(.+)<\/title>/',$li_text,$match);
echo $match[1];
titleタグを引っ張ってくるのは直ぐに出来たのですが、 htmlソース内に複数の
<h2 class="leadContentTitle">
<a href="link">文字列</a>
</h2>
があり、その中の<a href="link">文字列</a>だけを抜き出したかったのですが、<a href="link">文字列</a>
</h2>
如何せん正規表現が調べても調べてもイマイチよくわからなくて、
preg_match('/<h2 class=\"leadContentTitle\">(.*)<\/h2>/i',$line, $match);とか
preg_match_all関数とか,ereg関数とか色々やってみたんですが、
5時間くらい悩んだあげく、自分の望んでいるものが取得できなかった。
そこで、一度DOMにしたら、もしかしていけるんじゃないかと思い、
調べていたら、
PHP Simple HTML DOM Parser
という優れものがありました!!
上記のサイトからsimplehtmldomのソースをダウンロードしてきて
フォルダ内のsimple_html_dom.phpをサーバーにいれます。
んで、phpで
//simple_html_dom.phpを読み込む。
include('simple_html_dom.php');
//file_get_domで外部URLの値を取得してきます。
$dom = file_get_dom('URL');
//取得したいタグの数分繰り返す。
for($i = 0; $i < 8; $i++ ){
//配列に<h2 class="leadContentTitle"></h2>内のテキストのみ追加される。
$test[] = $dom->find('h2[class=leadContentTitle]', $i)->innertext;
//配列を一つの文字列に変換
$li_text = implode("", $h2_array);
//<a>タグ内のリンク先とテキスト部分をバラバラに抜き出す。
preg_match_all("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$li_text,$match);
$url=$match[1];
$text=$match[2];
//XML作成
$dom = new domDocument('1.0');
$dom->encoding = "UTF-8";
$dom->formatOutput = true;
$database = $dom->createElement('database');
$dom->appendChild($database);
for($i = 0; $i < 20; $i++){
$items = $database->appendChild($dom->createElement('items'));
$d_url = $items->appendChild($dom->createElement('d_url'));
$d_url->appendChild($dom->createTextNode($url[$i]));
$d_text = $items->appendChild($dom->createElement('d_text'));
$d_text->appendChild($dom->createTextNode($text[$i]));
}
// DomXMLをXML形式で出力
echo $dom->saveXML();
$dom->save("name.xml");
}
あとは、このXMLデータをFlashでつかって表示させた。include('simple_html_dom.php');
//file_get_domで外部URLの値を取得してきます。
$dom = file_get_dom('URL');
//取得したいタグの数分繰り返す。
for($i = 0; $i < 8; $i++ ){
//配列に<h2 class="leadContentTitle"></h2>内のテキストのみ追加される。
$test[] = $dom->find('h2[class=leadContentTitle]', $i)->innertext;
//配列を一つの文字列に変換
$li_text = implode("", $h2_array);
//<a>タグ内のリンク先とテキスト部分をバラバラに抜き出す。
preg_match_all("|<a href=\"(.*?)\".*?>(.*?)</a>|mis",$li_text,$match);
$url=$match[1];
$text=$match[2];
//XML作成
$dom = new domDocument('1.0');
$dom->encoding = "UTF-8";
$dom->formatOutput = true;
$database = $dom->createElement('database');
$dom->appendChild($database);
for($i = 0; $i < 20; $i++){
$items = $database->appendChild($dom->createElement('items'));
$d_url = $items->appendChild($dom->createElement('d_url'));
$d_url->appendChild($dom->createTextNode($url[$i]));
$d_text = $items->appendChild($dom->createElement('d_text'));
$d_text->appendChild($dom->createTextNode($text[$i]));
}
// DomXMLをXML形式で出力
echo $dom->saveXML();
$dom->save("name.xml");
}
RSS以外のものでも、Flashにデータを送れることを今回勉強してわかった。
このやり方が正しいのかはわかりませんけど。。。
多分おかしい。でも動いてるから・・・