Действительный домен - это то, что я могу зарегистрировать, или, по крайней мере, то, что выглядит так, будто я могу его зарегистрировать. Вот почему я люблю отделять это от имен localhost.
И, наконец, меня заинтересовал главный вопрос, будет ли избегать регулярных выражений быстрее, и это мой результат:
<?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» является допустимым доменным именем, используйте эту функцию , которая действует в общедоступном списке рассылки. Может быть, кто-то найдет время объединить оба.