使用PHP获取页面标题的问题

时间:2011-08-11 23:07:37

标签: php

我在PHP中执行此功能以获取页面标题。我知道它可能看起来有点乱,但那是因为我是PHP的初学者。我之前在if中使用了preg_match("/<title>(.+)<\/title>/i",$returned_content,$m)并且它没有像我预期的那样工作。

function get_page_title($url) {
    $returned_content = get_url_contents($url);
    $returned_content = str_replace("\n", "", $returned_content);
    $returned_content = str_replace("\r", "", $returned_content);
    $lower_rc = strtolower($returned_content);
    $pos1 = strpos($lower_rc, "<title>") + strlen("<title>");
    $pos2 = strpos($lower_rc, "</title>");
    if ($pos2 > $pos1)
        return substr($returned_content, $pos1, $pos2-$pos1);
    else
        return $url;
}

当我尝试使用上述函数获取以下页面的标题时,这就是我所得到的: http://www.google.com - &gt; “302感动” http://www.facebook.com - &gt; “” http://www.facebook.com” http://www.revistabula.com/posts/listas/100-links-para-clicar-antes-de-morrer - &gt; “http://www.revistabula.com/posts/listas/100-links-para-clicar-antes-de-morrer” (当我在链接的末尾添加一个/,我可以成功获得标题:“100个链接para clicar antes de morrer | Revista Bula”)

我的问题是: - 当我尝试访问google.com时,我知道google正在重定向到我国家的镜像,但是如何才能获得重定向到的页面标题? - 我的功能有什么问题让它获得某些页面的标题,而不是其他页面的标题?

2 个答案:

答案 0 :(得分:5)

HTTP客户端应遵循重定向。 302状态代码意味着您尝试获取的内容不在该位置,并且客户端应该遵循Location:标头来确定它的位置。

这里有两个问题。第一个不是重定向。如果你使用cURL,你可以通过设置它来使它遵循重定向:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

请参阅此问题以获得完整的解决方案:

Make curl follow redirects?

第二个问题是您使用RegEx解析HTML。 Don't do that。请参阅此问题以获得更好的替代方案:

How do you parse and process HTML/XML in PHP?

答案 1 :(得分:0)

为什么不尝试这样的事情?效果很好。

function get_page_title($url) 
{
        $source = file_get_contents($url);

        $results = preg_match("/<title>(.*)<\/title>/", $source, $title_matches);
        if (!$results) 
            return null; 

        //get the first match, this is the title 
        $title = $title_matches[1];
        return $title;
}