9

我正在尝试使用 parse_url 从 url 获取主机。但在某些查询中,我得到空结果。这是我的功能:

function clean_url($urls){
    $good_url=array();
    for ($i=0;$i<count($urls);$i++){
        $url=parse_url($urls[$i]);

       //$temp_string=str_replace("http://", "", $urls[$i]);
       //$temp_string=str_replace("https://", "", $urls[$i]);
       //$temp_string=substr($temp_string, 0,stripos($temp_string,"/"));
       array_push($good_url, $url['host']);
    }
    return $good_url;
}

输入数组:

Array ( 
    [0] => https://en.wikipedia.org/wiki/Data 
    [1] => data.gov.ua/ 
    [2] => e-data.gov.ua/ 
    [3] => e-data.gov.ua/transaction 
    [4] => https://api.jquery.com/data/ 
    [5] => https://api.jquery.com/jquery.data/ 
    [6] => searchdatamanagement.techtarget.com/definition/data 
    [7] => www.businessdictionary.com/definition/data.html  
    [8] => https://data.world/ 
    [9] => https://en.oxforddictionaries.com/definition/data 
)

具有空结果的结果数组

Array ( 
    [0] => en.wikipedia.org 
    [1] => 
    [2] => 
    [3] => 
    [4] => api.jquery.com 
    [5] => api.jquery.com 
    [6] => 
    [7] => 
    [8] => data< 
    [9] => en.oxforddictionaries.com 
)
4

6 回答 6

8

正在解析的其中一些$urls没有导致parse_url将主机识别为路径的方案。

例如,解析 url作为路径data.gov.ua/返回。向该 urldata.gov.ua/添加一个方案,例如,这样它就可以被识别为主机。httpshttps://data.gov.ua/parse_urldata.gov.ua/

于 2016-12-23T20:26:08.107 回答
2

我做了这个简单的函数,它给了我 url(用于名称)和完整 url(用于 hrefs)

public static function parseUrl($target_url)
{
    $url = "";
    $url_full = "";

    if (!empty($target_url)) {
        $parser = @parse_url($target_url);
        if (!empty($parser['host'])) {
            $url = $parser['host'];
            if (!empty($parser['scheme'])) {
                $url_full = $parser['scheme'] . "://" . $parser['host'];
            } else {
                $url_full = "//" . $parser['host'];
            }
        } else {
            if (!empty($parser['path'])) {
                return self::parseUrl("//".$parser['path']);
            }
        }
    }

    return array('url' => $url, 'url_full' => $url_full);
}

举个例子来说很好

Array
(
    [url] => en.wikipedia.org
    [url_full] => https://en.wikipedia.org
)
Array
(
    [url] => data.gov.ua
    [url_full] => //data.gov.ua
)
Array
(
    [url] => e-data.gov.ua
    [url_full] => //e-data.gov.ua
)
Array
(
    [url] => e-data.gov.ua
    [url_full] => //e-data.gov.ua
)
Array
(
    [url] => api.jquery.com
    [url_full] => https://api.jquery.com
)
Array
(
    [url] => api.jquery.com
    [url_full] => https://api.jquery.com
)
Array
(
    [url] => searchdatamanagement.techtarget.com
    [url_full] => //searchdatamanagement.techtarget.com
)
Array
(
    [url] => www.businessdictionary.com
    [url_full] => //www.businessdictionary.com
)
Array
(
    [url] => data.world
    [url_full] => https://data.world
)
Array
(
    [url] => en.oxforddictionaries.com
    [url_full] => https://en.oxforddictionaries.com
)

所以你可以使用:

<a href="{$url['url_full']}" target="_blank">{$url['url']}</a>
于 2017-02-07T08:54:39.033 回答
2

URL 的一般格式是:

scheme://hostname:port/path?query#fragment

URL 的每一部分都是可选的,它使用它们之间的分隔符来确定提供或省略了哪些部分。

主机名是 URL//前缀后面的部分。您的许多 URL 都缺少此前缀,因此它们没有主机名。

例如,parse_url('data.gov.ua/')返回:

Array
(
    [path] => data.gov.ua/
)

为了得到你想要的,它应该是parse_url('//data.gov.ua/')

Array
(
    [host] => data.gov.ua
    [path] => /
)

这经常使程序员感到困惑,因为浏览器对于在位置字段中输入不完整的 URL 非常宽容,它们具有启发式方法来尝试确定某些内容是主机名还是路径。但是像这样的 APIparse_url()对此更加严格。

于 2016-12-23T20:31:19.850 回答
0

我执行了你的脚本并遇到了一个 php 问题:

注意:未定义索引:主机

所以,变量 $url['host'] 不存在......如果我在这种情况下 var_dump 输出,则返回内容:

array (size=3)
  'scheme' => string 'https' (length=5)
  'host' => string 'en.wikipedia.org' (length=16)
  'path' => string '/wiki/Data' (length=10)

array (size=1)
  'path' => string 'data.gov.ua/' (length=12)

( ! ) Notice: Undefined index: host


array (size=1)
  'path' => string 'e-data.gov.ua/' (length=14)

( ! ) Notice: Undefined index: host

如您所见,url 被解释为路径。

输出:

  1. $urls[] = 'data.gov.ua/';错误。不是有效的网址
  2. $urls[] = '//data.gov.ua/';有效的。
  3. $urls[] = 'http://data.gov.ua/';有效的。

提示://如果您不知道它是 http 还是 https,请使用。

顺便说一句,您可以简化代码:p

function clean_url(array $urls) {
    $good_url = [];
    foreach( $urls as $url ) {
        // add a chech on the start of the url.

        $parse = parse_url($url);

        if( isset($url['host']) )
            array_push($good_url, $url['host']);
        else
            $good_url[] = 'Invalid Url'; // for example, or triger error.
    }
    return $good_url;
}

foreachisset

于 2016-12-23T20:29:04.953 回答
-1


前段时间,我为类似问题开发了一个解决方案。
我对原始代码进行了一些更改以满足您的规范。
它很实用,但不是很优雅。

function clean_url($urls)
{
    $good_url=array();
    for ($i=0;$i<count($urls);$i++){
        $domain=$urls[$i];

        $domain = str_replace("www.","",$domain);
        $domain = str_replace("https://","",$domain);
        $domain = str_replace("http://","",$domain);
        $domain=explode("/", $domain);

       array_push($good_url, $domain[0]);
    }
    return $good_url;
}

$urls=array( 
"0" => "https://en.wikipedia.org/wiki/Data" ,
"1" => "data.gov.ua/" ,
"2" => "e-data.gov.ua/",
"3" => "e-data.gov.ua/transaction",
"4" => "https://api.jquery.com/data/",
"5" => "https://api.jquery.com/jquery.data/" ,
"6" => "searchdatamanagement.techtarget.com/definition/data" ,
"7" => "www.businessdictionary.com/definition/data.html"  ,
"8" => "https://data.world/",
"9" => "https://en.oxforddictionaries.com/definition/data");

echo "<pre>";
print_r(clean_url($urls));
echo "</pre>";

此致,

于 2016-12-23T20:45:43.643 回答
-1

这是错误的 http 架构。我已将 http:// 添加到所有 url 并且它的工作

于 2016-12-27T17:44:40.147 回答