PHP-获取第一个标签

时间:2018-10-02 20:32:04

标签: php html string web

这是个问题:

我想提取网站标题。我已经看到了多种实现,但是它们都没有处理带有多个<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>中处理了新行。有什么“不错”的方法吗?

1 个答案:

答案 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 "";
}