Я сделал функцию для проверки доменного имени без каких-либо регулярных выражений.
<?php
function validDomain($domain) {
$domain = rtrim($domain, '.');
if (!mb_stripos($domain, '.')) {
return false;
}
$domain = explode('.', $domain);
$allowedChars = array('-');
$extenion = array_pop($domain);
foreach ($domain as $value) {
$fc = mb_substr($value, 0, 1);
$lc = mb_substr($value, -1);
if (
hash_equals($value, '')
|| in_array($fc, $allowedChars)
|| in_array($lc, $allowedChars)
) {
return false;
}
if (!ctype_alnum(str_replace($allowedChars, '', $value))) {
return false;
}
}
if (
!ctype_alnum(str_replace($allowedChars, '', $extenion))
|| hash_equals($extenion, '')
) {
return false;
}
return true;
}
$testCases = array(
'a',
'0',
'a.b',
'google.com',
'news.google.co.uk',
'xn--fsqu00a.xn--0zwm56d',
'google.com ',
'google.com.',
'goo gle.com',
'a.',
'hey.hey',
'google-.com',
'-nj--9*.vom',
' ',
'..',
'google..com',
'www.google.com',
'www.google.com/some/path/to/dir/'
);
foreach ($testCases as $testCase) {
var_dump($testCase);
var_dump(validDomain($TestCase));
echo '<br /><br />';
}
?>
Этот код выводит:
string (1) "a" bool (false)строка (1) "0" bool (false)string (3) "ab" bool (true)string (10) "google.com" bool (true)string (17) "news.google.co.uk" bool (true)строка (23) "xn - fsqu00a.xn - 0zwm56d" bool (true)string (11) "google.com" bool (false)строка (11) "google.com."BOOL (истина)string (11) "goo gle.com" bool (false)строка (2) "а."BOOL (ложь)string (7) "hey.hey" bool (правда)string (11) "google-.com" bool (false)string (11) "-nj - 9 * .vom" bool (false)string (1) "" bool (false)string (2) ".." bool (false)string (11) "google..com" bool (false)строка (14) "www.google.com" bool (true)string (32) "www.google.com/some/path/to/dir/" bool (false)
Надеюсь, я все рассмотрел, если что-то пропустил, скажите, пожалуйста, и я могу улучшитьэта функция.:)