2011-02-10 4 views
0

Я некоторые домены, которые я хочу разделить, но не могу понять, регулярное выражение ...домен регулярное выражение разделить

у меня есть:

  • http://www.google.com/tomato
  • http://int.google.com
  • http://google.co.uk

При любом из них я пытаюсь извлечь только google. Есть идеи?

+1

По какому правилу вы выберете 'google' из третьего примера, а не' co'? –

+0

Ровно! Я пробовал регулярное выражение на «//», но это не сработало ... может быть, требуется двойной preg_split? – David19801

+0

Для проверки правильности домена см. Http://stackoverflow.com/a/16491074/112731 –

ответ

0

Вы можете сделать это на наилучшая ставка. Последняя часть URL-адреса - это всегда TLD (и дополнительный root). И вы в основном ищете любое предшествующее слово, которое больше, чем 2 буквы:

$url = "http://www.google.co.uk./search?q=.."; 

preg_match("#http:// 
      (?:[^/]+\.)*  # cut off any preceeding www* 
      ([\w-]{3,})  # main domain name 
      (\.\w\w)?   # two-letter second level domain .co 
      \.\w+\.?   # TLD 
      (/|:|$)   # end regex with/or : or string end 
      #x", 
     $url, $match); 

Если вы ожидаете больше доменов второго уровня (.com, может быть?), А затем добавить еще один \w. Но это не очень общий, вам действительно нужен список для TLD, это было разрешено.

0

Ответ здесь может быть тем, что вы ищете.

Getting parts of a URL (Regex)

+0

При этом регулярное выражение очень интенсивно используется в памяти. Я предполагаю parse_url(); гораздо менее ресурсоемкий, чем ссылка regex, которую я опубликовал. – aendrew

3

почему вы пытаетесь использовать регулярное выражение? есть много встроенных функций, доступных для вас, таких как:

$host = parse_url($url, PHP_URL_HOST); 

обновление, дать этому идти, возможно, потребуется улучшение, но лучше, чем Regex имо

function determainDomainName($url) 
{ 
    $hostname = parse_url($url, PHP_URL_HOST); 
    $parts = explode(".",$hostname); 

    switch(count($parts)) 
    { 
     case 1: 
      return $parts[0]; //has to be a .com etc 
     break; 
     case 2: 
      if($parts[1] == "www") //The most common subdomain 
      { 
       return $parts[2]; //Bypass Subdomain/return next segment 
      } 

      if($parts[2] == "co") //Possible in_array here for multiples, but first segment of double barrel tld 
      { 
       return $parts[1]; //Bypass double barrel tld's 
      } 
     break; 
     default: 
      //Have a guess 
      //I bet the longest word is the domain :) 
      usort($parts,"mysort"); 
      return $parts[0]; 

      /* 
      here we just order the array by the longest word 
      so google will always come above the following 
      com,co,uk,www,cdn,ww1,ww2 etc 
      */ 
     break; 
    } 
} 

function mysort($a,$b){ 
    return strlen($b) - strlen($a); 
} 

Добавьте следующие 2 функции в библиотеках и т.д.

Затем используйте так:

$urls = array(
    'http://www.google.com/tomato', 
    'http://int.google.com', 
    'http://google.co.uk' 
); 

foreach($urls as $url) 
{ 
    echo determainDomainName($url) . "\n"; 
} 

Они все эхо google

см @http://codepad.org/pA5KWckb

+0

У этого есть .com или .co.uk в конце ... – David19801

+0

Обновлено, чтобы прогматически определить доменное имя, вы не должны пытаться полагаться на Regex, поскольку он может стать очень зависимым и беспорядочным. – RobertPitt

0
 
$res = preg_replace("/^(http:\/\/)([a-z_\-]+\.)*([a-z_\-]+)\.(com|co.uk|net)\/.*$/im", "\$3", $in); 

Добавить столько окончаний, как вы знаете,

Edit: сделал ошибку :-(

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