Домен второго уровня

Статус
В этой теме нельзя размещать новые ответы.
Вот тебе накропал вариант

PHP:
<?

$alsoDomains = array ('com.ru', 'spb.ru' ); //и так далее


$domainList = array (); //сюда будет складываться результат


//открываем список
$list = file ( 'list.txt' );

foreach ( $list as $item ) {
	//подчищаем строку и приводим к нормальному виду
	$item = trim ( $item ); //лишние пробелы по краям убрали
	$item = strtolower ( $item ); //в нижний регистр
	$item = str_replace ( "http://", "", $item ); //пока http:// нам не нужен
	$item = rtrim ( $item, " \\/" ); //убирае слэш на конце
	

	//разбиваем имя
	$parts = explode ( ".", $item );
	
	if (count ( $parts ) == 2) { 
		//понятно что это домен
		$domainList [] = getFullDomain ( $item );
		continue;
	}
	if (count ( $parts) == 3  && ($parts [0] == 'www' || in_array ( getJoinedZone ( $parts ), $alsoDomains ))) {
		//домен типа www.domain.com и domain.com.ru
		$domainList [] = getFullDomain ( $item );
		continue;
	}
	
	if (count ( $parts ) == 4 && $parts [0] == 'www' && in_array ( getJoinedZone ( $parts ), $alsoDomains)) {
		//домен типа www.domain.com.ru
		$domainList [] = getFullDomain ( $item );
		continue;
	}
}

//пишем вывод в файл 
file_put_contents ( 'result.txt', join ( "\n", $domainList ) );

function getFullDomain($item) {
	return 'http://' . $item . '/'; //ранее убранный слэш и http://
}

//скеиваем 1и 2й уровень
function getJoinedZone($parts) {
	$count=count($parts);
	$joinedZone=$parts[$count-2].'.'.$parts[$count-1];
	return $joinedZone;
}
?>

$alsoDomains - сюда надо вбить все возможные виды зон. Увы иначе никак не определить что это именно зона а не домен из 2х букв

И кто теперь скажет, что регуляркой проще?
 
Чет вы перемудрили.
Мой метод на все что не xxx.xxx.xx и равное Для просмотра ссылки Войди или Зарегистрируйся выдаст false, то есть что поддомен неккоректен, то есть ну никак не посчитает.
Поправка- и НЕ равное Для просмотра ссылки Войди или Зарегистрируйся, ибо $hostParts[0]!='www'
Т.е. см выше тест, логика работы функции не понятна.

Конечно проще
PHP:
<?php
$alsoDomains = array ('com.ru', 'spb.ru' ); //и так далее 
function isTwo($host) {
   global $alsoDomains;
   if(preg_match('{^http://(?:www\.)?\w+\.(?:\w+|(\w+\.\w+))/?$}', $host, $resut)) {
      if(isset($resut[1])){
         return in_array($resut[1], $alsoDomains);
      } else {
	     return true;
	  }
   }
   return false; 
}


$in=fopen('list.txt', 'r');
$out=fopen('result.txt', 'w');
while(!feof($in)) {
  if(isTwo(trim($host=fgets($in))))  
     fwrite($out, $host);   
}
?>

Кроме того, возможны варианты, когда сайт находится не на поддомене, а в папке (например, domain.com/~user). Эти тоже нужно исключить.
Это фри хостинги/блогфермы где сайт создается на основном домене?
domain.com/user само пропускается, но если у тебя в файле не домены, а адреса начальных страниц, то во первых, автоматом не определишь, самостоятельный сайт это или нет (по готовой базе блогферм/фри хостов разве только), во вторых коды выше надо будет поправить, чтобы они корректно работали. Указывай входные данные.

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

Liver
Чем сложнее задача, тем сложнее без регулярок. Каково например в короткий срок реализовать такое Для просмотра ссылки Войди или Зарегистрируйся без регулярок:D
 
RolCom

Поправка. Просто я неправильно считал уровни домена. Я забыл что зоны и есть домены первого уровня. Поэтому логика метода ориентирована была именно на xxx.domain.com поиск и должна была исключать Для просмотра ссылки Войди или Зарегистрируйся. Да об моей ошибке (кстати никто кроме тс меня в нее не ткнул почему то) говорит и название метода -isValidSubdomain).

Я проверил ваш вариант на тестовом списке. Рабочий, но такое выражение слишком сложно читабельное. Впрочем о вкусах не спорят.

Итак уже есть 2 рабочих варианта.

пойду гляну по ссылке

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

function is_2_level($any_url) {

$prepared_url = str_replace('http://', '', $any_url); //откидываем если есть
$pieces = explode("/", $prepared_url);
$url_without_uri = $pieces[0]; // выделяем домен
$splitted_by_dot = explode(".", $url_without_uri);
if (count($splitted_by_dot) == 2 || (count($splitted_by_dot) == 3 && $splitted_by_dot[0] == 'www')) {
return true;
} else {
return false;
}

}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху