2009-07-09 3 views
0

У меня есть URL-адрес, как это:Url расщепления в PHP

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

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

parse_url($url,PHP_URL_HOST); 

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

ответ

6

Есть много способов, вы можете сделать это. Простая замена является самой быстрой, если вы знаете, что всегда хотите удалить «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):

  • Простой str_replace: 1
  • preg_replace с /^\w+\./: 1,494
  • StrPos/зиЬзЬг: 1,982
  • взрываются/Implode : 2.472

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

  • explode:

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

    Поскольку explode последовательно медленный подход, мало смысла в написании версии, которая обрабатывает "CO.UK".

  • регулярное выражение:

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

    Это захватывает последние две части из домена и заменяет полное значение строки с захваченной частью. С несколькими субдоменами все главные части обрываются.

    Для работы с ".ru" -как домены, а также переменное количество поддоменов, попробуйте:

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

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

    Учет co.uk доменов :

    $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; 
        } 
    } 
    

регулярное выражение n-й str-реализация может быть сделана все-таки немного быстрее, жертвуя краевыми случаями (где основной компонент домена является одной буквой, например. "A.com"):

  • регулярное выражение:

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

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

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

  • множественного подобласть регулярное выражение: 1
  • .co.uk регулярное выражение (быстро): 1.01
  • .co.uk ул (быстро): 1,056
  • .co.uk регулярное выражение (правильный): 1.1
  • .co.uk ул (правильная): 1,127
  • множественной подобласти ул: 1,282
  • множественной подобласть взрывается: 1,305

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

+0

Приятно, что вы в бенчмарке! – altermativ

0

Вы должны снять часть субдомена самостоятельно - для этого нет встроенной функции.

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

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

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

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

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

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

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

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

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

+0

это то, что я хотел ... может помочь мне, как это сделать? – Andromeda

+0

Dixons предложение делает это. –

+0

Регулярное выражение Dixon не будет работать на голых доменах. Например, «domain.com» будет превращен в «com». Вот еще одно регулярное выражение, которое соответствует псевдо логике Рутеша: '$ domain = preg_replace ('/^(?(?=[^.]++\.[^.]++\.)[^.]+ + \. |)/',' ', $ domain); ' – Geert

Смежные вопросы