以前に「
」の一部で タイトルタグの間の文字列を取得するスクリプトを紹介しましたが、もっと短くできました。
<?php
function getTitle( $url ) {
$byte = 256;
while(empty($matches)){
//無限ループにならないようにバイト数を制限
if($byte > 10000){
break;
}
//file_get_contents($url)でも読めるが、バイト数指定で読み込む
$html = file_get_contents($url, NULL, NULL, 0, $byte);
preg_match("@<title.*?>(.*?)</title>@i" , $html, $matches);
$byte= $byte + 256;
}
$html = $matches[1];
$html = mb_convert_encoding($html, mb_internal_encoding(), "auto" );
return($html);
}
echo getTitle("http://qwerty.work");
?>
タイトルタグが見つからなかったり、 タイトルタグよりも前に大量の文字列があると読み込みに時間がかかるので、読み込みのバイト数上限を決め、タイトルが見つかるまで徐々に読み込みバイト数を増やしていくようにしました。
↓上記でhttp://qwerty.workのタイトルを取得した結果
20011/03/06追記
PHPのクラスライブラリPEARのパッケージ(iHTTP_Client)を使った方法が見つかったのでメモ。
こっちの方が**高速!**な感じがします…。
※PEARのパッケージHTTP_Clientと依存関係にあるHTTP_Request2が必要です。
<?php
function getTitle($targetUrl){
require_once $_SERVER['DOCUMENT_ROOT']."/lib/PEAR/HTTP_Client/Client.php";
$client =& new HTTP_Client();
$client->get($targetUrl);
$response = $client->currentResponse();
//余計な改行コードをスペースに変換
$response = str_replace( array( chr(10), chr(13), chr(9) ), chr(32), $response['body'] );
preg_match("/<title.*?>(.*?)<\/title>/", $response, $title_matches);
$title = $title_matches[1];
$title = mb_convert_encoding($title, mb_internal_encoding(), "auto" );
return($title);
}
echo getTitle("http://qwerty.work");
?>
ついでにJavascriptでタイトルを取得する方法もメモ。
※現在のURLのタイトルしか取得できません。
<script type="text/javascript">
document.write("このページのタイトルは→「"+document.title+"」です。");
</script><br>
結果: document.write(“このページのタイトルは→「"+document.title+"」です。”);