这是个问题:
我想提取网站标题。我已经看到了多种实现,但是它们都没有处理带有多个<title>
标签的网站。因此,目前我正在使用类似的方法提取第一个(真实)标题:
function GetTitleFromWebSite($url)
{
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$page = @file_get_contents($url, false, stream_context_create($arrContextOptions));
if ( $page )
{
$title_begin = strpos($page, "<title>");
if ( $title_begin )
{
$title_end = strpos( $page, "</title>" );
if ( $title_end )
{
$title_begin += 7;
$title = htmlentities( substr($page, $title_begin, $title_end - $title_begin) );
return $title;
}
}
}
return "";
}
我知道这并不安全,但这仅用于测试,我稍后会担心认证。
问题是:
处理此问题的最佳方法是什么?有什么东西可以照顾到所有疯狂的建筑吗?一些实现在<title>
中处理了新行。有什么“不错”的方法吗?
答案 0 :(得分:0)
未经测试,并基于您实际上可以从远程url捕获html的假设,那么以下内容可能会为您提供解决方案
function GetTitleFromWebSite( $url ){
$opts=array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
),
);
$titles=array();
$page = @file_get_contents($url, false, stream_context_create($opts));
if ( $page ) {
libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->standalone=true;
$dom->preserveWhiteSpace=true;
$dom->strictErrorChecking=false;
$dom->recover=true;
$dom->loadHTML( $page );
libxml_clear_errors();
$col=$dom->getElementsByTagName( 'title' );
if( $col->length > 0 ){
foreach( $col as $title ) $titles[]=$node->nodeValue;
}
return $titles;
}
return "";
}