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/返さdata.gov.ua/れます。httpsたとえばそのURLにスキームを追加して、ホストとして認識https://data.gov.ua/できるようにします。parse_urldata.gov.ua/

于 2016-12-23T20:26:08.107 に答える
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 を入力しても非常に寛容であり、何かがホスト名なのかパスなのかを判断しようとするヒューリスティックがあるため、これはしばしばプログラマーを混乱させます。しかし、API のようなものparse_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/';エラー。有効な URL ではありません
  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;
}

foreachて、isset

于 2016-12-23T20:29:04.953 に答える
-1

httpスキーマが間違っていました。すべての URL に http:// を追加しましたが、うまくいきました

于 2016-12-27T17:44:40.147 に答える
-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 に答える