Для меня действительный домен - это то, что я могу зарегистрировать или, по крайней мере, похоже, что я могу его зарегистрировать. Это причина, по которой я предпочитаю отделить это от имен "localhost".
И, наконец, меня заинтересовал главный вопрос, будет ли избегать Regex быстрее, и это мой результат:
<?php
function filter_hostname($name, $domain_only=false) {
// entire hostname has a maximum of 253 ASCII characters
if (!($len = strlen($name)) || $len > 253
// .example.org and localhost- are not allowed
|| $name[0] == '.' || $name[0] == '-' || $name[ $len - 1 ] == '.' || $name[ $len - 1 ] == '-'
// a.de is the shortest possible domain name and needs one dot
|| ($domain_only && ($len < 4 || strpos($name, '.') === false))
// several combinations are not allowed
|| strpos($name, '..') !== false
|| strpos($name, '.-') !== false
|| strpos($name, '-.') !== false
// only letters, numbers, dot and hypen are allowed
/*
// a little bit slower
|| !ctype_alnum(str_replace(array('-', '.'), '', $name))
*/
|| preg_match('/[^a-z\d.-]/i', $name)
) {
return false;
}
// each label may contain up to 63 characters
$offset = 0;
while (($pos = strpos($name, '.', $offset)) !== false) {
if ($pos - $offset > 63) {
return false;
}
$offset = $pos + 1;
}
return $name;
}
?>
Результаты тестирования по сравнению с функцией velcrow и 10000 итераций (полные результаты содержит множество вариантов кода. Было интересно найти самый быстрый.):
filter_hostname($domain);// $domains: 0.43556308746338 $real_world: 0.33749794960022
is_valid_domain_name($domain);// $domains: 0.81832790374756 $real_world: 0.32248711585999
$real_world
не содержал слишком длинных доменных имен для получения лучших результатов. И теперь я могу ответить на ваш вопрос: с использованием ctype_alnum()
можно было бы реализовать это без регулярного выражения, но поскольку preg_match()
был быстрее, я бы предпочел это.
Если вам не нравится тот факт, что "local.host" является допустимым доменным именем, используйте эту функцию вместо публичный список TLD. Может, у кого-то найдется время совместить и то, и другое.
person
mgutt
schedule
04.03.2015
false
. - person Matteo Riva   schedule 18.11.2009domaia@name
- допустимое доменное имя. Однако это недопустимое имя host. Смотрите мой ответ. - person Alnitak   schedule 23.09.2010