2015-09-17 2 views
2

Я знаю, что в Интернете есть много информации по этой теме, но я не могу понять, как я хочу.PHP-доменное имя домена от url

Я пытаюсь построить функцию, которая вырезает имя домена из URL:

http://blabla.com blabla 
www.blabla.net  blabla 
http://www.blabla.eu blabla 

только равнину имя домена необходимо.

С помощью parse_url я получаю фильтр домена, но этого недостаточно. У меня есть 3 функции, которые НТИП домена, но до сих пор я получаю некоторые неправильные выходы

function prepare_array($domains) 
{ 
    $prep_domains = explode("\n", str_replace("\r", "", $domains)); 
    $domain_array = array_map('trim', $prep_domains); 

    return $domain_array; 
} 

function test($domain) 
{ 
    $domain = explode(".", $domain); 
    return $domain[1]; 
} 

function strip($url) 
{ 
    $url = trim($url); 
    $url = preg_replace("/^(http:\/\/)*(www.)*/is", "", $url); 
    $url = preg_replace("/\/.*$/is" , "" ,$url); 
    return $url; 
} 

Всевозможного домен, URL и расширение разрешено. После завершения функции она должна вернуть массив только имен доменов.

ОБНОВЛЕНИЕ: Спасибо за все предложения!

Я понял это с помощью всех вас.

function test($url) 
{ 
    // Check if the url begins with http:// www. or both 
    // If so, replace it 
    if (preg_match("/^(http:\/\/|www.)/i", $url)) 
    { 
     $domain = preg_replace("/^(http:\/\/)*(www.)*/is", "", $url); 
    } 
    else 
    { 
     $domain = $url; 
    } 

    // Now all thats left is the domain and the extension 
    // Only return the needed first part without the extension  
    $domain = explode(".", $domain); 

    return $domain[0]; 
} 
+0

Попробуйте использовать 'функцию parse_url', чтобы сделать это. http://php.net/manual/function.parse-url.php – ChoiZ

+0

Что относительно субдоменов? –

ответ

0
function test($url) 
{ 
    // Check if the url begins with http:// www. or both 
    // If so, replace it 
    if (preg_match("/^(http:\/\/|www.)/i", $url)) 
    { 
     $domain = preg_replace("/^(http:\/\/)*(www.)*/is", "", $url); 
    } 
    else 
    { 
     $domain = $url; 
    } 

    // Now all thats left is the domain and the extension 
    // Only return the needed first part without the extension  
    $domain = explode(".", $domain); 

    return $domain[0]; 
} 
2

Как насчет

$wsArray = explode(".",$domain); //Break it up into an array. 
$extension = array_pop($wsArray); //Get the Extension (last entry) 
$domain = array_pop($wsArray); // Get the domain 

http://php.net/manual/en/function.array-pop.php

+0

На самом деле, комментарий ChoiZ выше, вероятно, лучший ответ. –

+0

[Этот ответ не работает на '.co.uk' и подобных доменах.] (Https://ideone.com/uyrYdv) – Zsw

+0

К сожалению, это не делает работу. Когда я ввожу http: // google.com, он возвращает http: // google – Rob

1

Ах, ваша проблема заключается в том, что домены верхнего уровня может быть либо в одной или двух частей против .com например .co.uk.

Что я хотел бы сделать, это поддерживать список TLD. С результатом после parse_url перейдите по списку и найдите совпадение. Разделите ДВУ, взорвайтесь на '.' и последняя часть будет в том формате, в котором вы хотите.

Это не выглядит так эффективно, как могло бы быть, но при добавлении TLD все время я не вижу другого детерминированного пути.

0

попробуйте с preg_replace.

что-то вроде $ domain = preg_replace ($ regex, '$ 1', $ url);

regex

+0

Это не отвечает на вопрос, потому что регулярное выражение, указанное в ссылке, не имеет захвата групп. – Zsw

1

Хорошо ... это грязно, и вы должны потратить некоторое время на оптимизацию и кэширование ранее полученные домены. У вас также должен быть дружественный NameServer, и последний улов должен иметь запись «A» в своем DNS.

Это попытка собрать доменное имя в обратном порядке, пока оно не сможет разрешить запись DNS «A».

В anyrate, это не давало мне покоя, поэтому я надеюсь, что этот ответ поможет:

<?php 
$wsHostNames = array(
    "test.com", 
    "http://www.bbc.com/news/uk-34276525", 
    "google.uk.co" 
); 
foreach ($wsHostNames as $hostName) { 
    echo "checking $hostName" . PHP_EOL; 
    $wsWork = $hostName; 
    //attempt to strip out full paths to just host 
    $wsWork = parse_url($hostName, PHP_URL_HOST); 
    if ($wsWork != "") { 
     echo "Was able to cleanup $wsWork" . PHP_EOL; 
     $hostName = $wsWork; 
    } else { 
     //Probably had no path info or malformed URL 
     //Try to check it anyway 
     echo "No path to strip from $hostName" . PHP_EOL; 
    } 

    $wsArray = explode(".", $hostName); //Break it up into an array. 

    $wsHostName = ""; 
    //Build domain one segment a time probably 
    //Code should be modified not to check for the first segment (.com) 
    while (!empty($wsArray)) { 
     $newSegment = array_pop($wsArray); 
     $wsHostName = $newSegment . $wsHostName; 
     echo "Checking $wsHostName" . PHP_EOL; 
     if (checkdnsrr($wsHostName, "A")) { 
      echo "host found $wsHostName" . PHP_EOL; 
      echo "Domain is $newSegment" . PHP_EOL; 
      continue(2); 
     } else { 
      //This segment didn't resolve - keep building 
      echo "No Valid A Record for $wsHostName" . PHP_EOL; 
      $wsHostName = "." . $wsHostName; 
     } 
    } 
    //if you get to here in the loop it could not resolve the host name 

} 
?> 
Смежные вопросы