0

我想知道是否有办法从 URL 中获取网站的名称。我知道你可以解析一个 URL 来获取一个域名,但是由于就代码而言,站点名称没有标准化,我对此表示怀疑。

如何使用它的一个例子是说我链接到纽约时报的一篇文章。我可以将文章的标题链接到文章页面。然后我可能希望在文章标题旁边显示来源“纽约时报”。如果我可以自动生成它,那将非常方便。

仅仅获取页面标题是行不通的,因为这通常会给您文章标题,或者,如果您要链接到其他类型的页面,您可能会得到一些字符串,例如“如何检索网站名称? - 堆栈溢出”。我只想获得其中的“堆栈溢出”部分。

有任何想法吗?

4

4 回答 4

1

您可以尝试应用程序名称属性:

<meta name="application-name" content="The New York Times" />

<meta name="application-name" content="CNN"/>

不是每个站点都会有这个,但你可以从这里开始,检查打开的图形标签 ( http://ogp.me ) 等。

于 2013-04-24T06:51:14.663 回答
0

如果你想解析 url,你可以试试这个函数:

$parsedUrl = parse_url($url);
$host = $parsedUrl['host']
echo $host;

这将为您提供一个关联数组,其中host关键是您要查找的内容。

见: http: //php.net/manual/en/function.parse-url.php

于 2013-04-24T06:49:46.567 回答
0

您所说的“站点名称”不是链接的一部分,它是该链接返回的 HTML 代码的一部分。

如果要获取站点标题,则应使用 CURL 检索链接内容,然后解析返回的 HTML 以获取该部分中标签的内容。

可能这将比您可以获得的好处更昂贵。

于 2013-04-24T07:09:41.290 回答
0

您将需要使用DOMDocument解析 DOM 树:

<?php
function GetTitle($url)
{
    $dom = new DOMDocument;
    @$dom->loadHTMLFile($url); // @ supresses warnings

    // try to get meta application-name
    foreach ($dom->getElementsByTagName("meta") as $meta)
    {
        $metaName = $meta->attributes->getNamedItem("name");
        if (strtolower($metaName->nodeValue) == "application-name")
        {
            $metaContent = $meta->attributes->getNamedItem("content");
            if ($metaContent != NULL)
                return $metaContent->nodeValue;
        }
    }

    // title fallback:
    foreach ($dom->getElementsByTagName("title") as $title)
        return $title->nodeValue;

    return NULL;
}

print(GetTitle("http://www.nytimes.com/"));
?>

首先,GetTitle()寻找<meta name="application-name">标签。如果未找到,它将回退并返回页面标题。

此外,您应该传递基本 url。Fe 如果你有这个 url: http://stackoverflow.com/questions/16185145/how-to-retrieve-website-names/16185654#16185654,你应该去掉除了http://stackoverflow.com使用parse_url之外的所有东西:

$parsedUrl = parse_url($url);
GetTitle($parsedUrl["scheme"] + "://" + $parsedUrl["host"]);
于 2013-04-24T07:13:49.010 回答