URL расщепление в php

У меня есть такой URL:

http://www.w3schools.com/PHP/func_string_str_split.asp

Я хочу разделить этот URL, чтобы получить только часть хоста. Для этого я использую

parse_url($url,PHP_URL_HOST);

он возвращает www.w3schools.com. Я хочу получить только "w3schools.com". Есть ли какая-либо функция для этого или я должен сделать это вручную?

Ответы на вопрос(3)

енной функции.

// $domain beeing www.w3scools.com
$domain = implode('.', array_slice(explode('.', $domain), -2));

Вышеприведенный пример также работает для поддоменов неограниченной глубины, поскольку он всегда возвращает последние две части домена (домен и домен верхнего уровня).

Если вы только хотите снятьwww. Вы можете просто сделатьstr_replace()что будет действительно быстрее:

$domain = str_replace('www.', '', $domain);
Решение Вопроса

мена, если вы знаете, что всегда хотите удалить «www.»

$stripped=str_replace('www.', '', $domain);

Замена регулярного выражения позволяет связать это совпадение с началом строки:

$stripped=preg_replace('/^www\./', '', $domain);

Если это всегда первая часть домена, независимо от того, является ли он www, вы можете использовать взорвать / взорвать. Хотя это легко читать, это самый неэффективный метод:

$parts=explode('.', $domain);
array_shift($parts); //eat first element
$stripped=implode('.', $parts);

Регулярное выражение достигает той же цели более эффективно:

$stripped=preg_replace('/^\w+\./', '', $domain);

Теперь вы можете представить, что следующее будет более эффективным, чем приведенное выше регулярное выражение:

$period=strpos($domain, '.');
if ($period!==false)
{
    $stripped=substr($domain,$period+1);
}
else
{
    $stripped=$domain; //there was no period
}

Но я проверил это и обнаружил, что за миллион итерацийpreg_replace Версия последовательно бить его. Типичные результаты, нормализованные до самых быстрых (поэтому он имеет единичное время 1):

Simple str_replace: 1 preg_replace with /^\w+\./: 1.494 strpos/substr: 1.982 explode/implode: 2.472

Приведенные выше примеры кода всегда удаляют первый компонент домена, поэтому он будет отлично работать на таких доменах, как & quot; www.example.com & quot; и "www.example.co.uk" но не "example.com" или & quot; www.department.example.com & quot ;. Если вам нужно обрабатывать домены, которые уже могут быть основным доменом или иметь несколько поддоменов (например, & quot; foo.bar.baz.example.com & quot;) и хотите уменьшить их до основного домена (& quot; example.com & quot) ;) попробуйте следующее. Первая выборка в каждом подходе возвращает только последние два компонента домена, поэтому не будет работать с "co.uk" -подобными доменами.

explode:

$parts = explode('.', $domain);
$parts = array_slice($parts, -2);
$stripped = implode('.', $parts);

Since explode is consistently the slowest approach, there's little point in writing a version that handles "co.uk".

regex:

$stripped=preg_replace('/^.*?([^.]+\.[^.]*)$/', '$1', $domain);

This captures the final two parts from the domain and replaces the full string value with the captured part. With multiple subdomains, all the leading parts get stripped.

To work with ".co.uk"-like domains as well as a variable number of subdomains, try:

$stripped=preg_replace('/^.*?([^.]+\.(?:[^.]*|[^.]{2}\.[^.]{2}))$/', '$1', $domain);

str:

$end = strrpos($domain, '.') - strlen($domain) - 1;
$period = strrpos($domain, '.', $end);
if ($period !== false) {
    $stripped = substr($domain,$period+1);
} else {
    $stripped = $domain;
}

Allowing for co.uk domains:

$len = strlen($domain);
if ($len < 7) {
    $stripped = $domain;
} else {
    if ($domain[$len-3] === '.' && $domain[$len-6] === '.') {
        $offset = -7;
    } else {
        $offset = -5;
    }
    $period = strrpos($domain, '.', $offset);
    if ($period !== FALSE) {
        $stripped = substr($domain,$period+1);
    } else {
        $stripped = $domain;
    }
}

Реализации на основе регулярных выражений и str можно сделать очень немного быстрее, пожертвовав крайними случаями (когда компонент основного домена представляет собой одну букву, например, «a.com»):

regex:

$stripped=preg_replace('/^.*?([^.]{3,}\.(?:[^.]+|[^.]{2}\.[^.]{2}))$/', '$1', $domain);

str:

$period = strrpos($domain, '.', -7);
if ($period !== FALSE) {
    $stripped = substr($domain,$period+1);
} else {
    $stripped = $domain;
}

Хотя поведение изменяется, ранжирование не происходит (большую часть времени). Вот они, время нормализовалось до самых быстрых.

multiple subdomain regex: 1 .co.uk regex (fast): 1.01 .co.uk str (fast): 1.056 .co.uk regex (correct): 1.1 .co.uk str (correct): 1.127 multiple subdomain str: 1.282 multiple subdomain explode: 1.305

Здесь разница между временами настолько мала, что она не является необычной для. Например, быстрое регулярное выражение .co.uk часто побеждает регулярное регулярное выражение множества субдоменов. Таким образом, точная реализация не должна оказывать заметного влияния на скорость. Вместо этого выберите один на основе простоты и ясности. Пока вам не нужно обрабатывать домены .co.uk, это будет подход регулярных выражений с несколькими поддоменами.

 09 июл. 2009 г., 14:04
Приятно с вашей точки зрения!

.] (Вместе с самим [.]), Если и только если в возвращаемой строке содержится более 1 вхождения символа [.].

например, если возвращаемая строка - www-139.in.ibm.com, то регулярное выражение должно быть таким, чтобы оно возвращало in.ibm.com, поскольку это будет домен.

Если возвращаемая строка - music.domain.com, то регулярное выражение должно возвращать domain.com

В редких случаях вы получаете доступ к сайту без префикса сервера, то есть вы можете получить доступ к сайту с помощьюhttp://domain.com/pageurlв этом случае вы получите домен непосредственно как domain.com, в этом случае регулярное выражение не должно ничего удалять

IMO, это должна быть псевдог логика регулярного выражения, если вы хотите, я могу сформировать регулярное выражение для вас, которое будет включать эти вещи.

 09 июл. 2009 г., 10:31
Регулярное выражение Диксона не будет работать на голых доменах. Например, & quot; domain.com & quot; будет превращен в "com". Вот еще одно регулярное выражение, которое соответствует псевдо-логике Рутеша:$domain = preg_replace('/^(?(?=[^.]++\.[^.]++\.)[^.]++\.|)/', '', $domain);
 09 июл. 2009 г., 11:19
Это будет работать для TLDS, таких как .com, .net и т. Д., Но как насчет домена, такого как geograph.org.uk - в итоге вы получите недействительный org.uk
 Andromeda09 июл. 2009 г., 10:15
это то, что я хотел ... ты можешь мне помочь как это сделать ??
 09 июл. 2009 г., 10:19
Предложение Диксона делает это.

Ваш ответ на вопрос