【问题标题】:Problems on getting a page's title with PHP使用 PHP 获取页面标题的问题
【发布时间】:2011-08-11 23:07:37
【问题描述】:

我在 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 -> “302 已移动” http://www.facebook.com -> ""http://www.facebook.com" http://www.revistabula.com/posts/listas/100-links-para-clicar-antes-de-morrer -> “http://www.revistabula.com/posts/listas/100-links-para-clicar-antes-de-morrer” (当我在链接末尾添加 / 时,我可以成功获得标题:“100 links para clicar antes de morrer | Revista Bula”)

我的问题是: - 当我尝试访问 google.com 时,我知道 google 正在重定向到我所在国家/地区的镜像,但是如何获取它重定向到的页面的标题? - 我的函数有什么问题导致它获得某些页面的标题,而不是其他页面的标题?

【问题讨论】:

  • get_url_contents($url) 返回什么?
  • get_url_contents() 的代码是什么?
  • 我已经接受了一个答案。 get_url_contents()返回页面html代码。

标签: php


【解决方案1】:

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?

【讨论】:

  • 完美答案!在您传递的链接“使用 PHP 解析 HTML 的最佳方法”中,我找到了“Simple HTML Dom Parser”,它解决了我的问题。
  • 优秀。很高兴我能帮上忙。
【解决方案2】:

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

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;
}

【讨论】:

  • 用正则表达式解析 HTML? We don't do that here
  • 这当然是可能的,我发现它在某些情况下效果很好。我已经使用 PHP 多年,但不知道如何使用 DOM Parser。用正则表达式解析 HTML 对于初学者来说似乎是一个不错的选择。
  • 你是对的:使用正则表达式解析 HTML 将在 某些 情况下工作。然而,好的代码应该处理所有有效的输入,而当 HTML 是输入时,正则表达式不能做到这一点。您的正则表达式将无法在这个丑陋但完全有效的 HTML sn-p 上返回预期结果:&lt;head&gt;&lt;title&gt;Site X&lt;![CDATA[&lt;/title&gt;]]&gt;&lt;/title&gt;&lt;/head&gt;.
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2021-02-23
相关资源
最近更新 更多