Szükségem volt arra, hogy egy adott string-ről eldöntsem, érvényes magyar (.hu) domain név-e avagy sem. Utánajártam a témának, és kiderítettem, hogy melyek a pontos szabályok .hu domain regisztrációja esetében:
Több időt töltöttem el a szabályok kinyomozásával és a php nyelvű teszt függvény megírásával, mint amennyit szerettem volna.
Megosztom itt is, ha valakinek spórolok vele pár órát, már megérte.
Végül egy tipp: ha nem host név áll rendelkezésre, hanem teljes URL akkor érdemes lehet használni a parse_url php-s függvény átírását is, ritkábban hasal el rossz bemenetekre.
<?php
/**
* .HU domain név ellenörző. Ellenörzi, hogy egy adott host érvényes magyar .hu
* domain-hez tartozik-e.
*
* Figyelembe vett szabályok:
* - a domain név hossza (min 2, max 40 karakter)
* - érvényes karakterek (a-z, 0-9, -, áéíóöőúüű)
* - kötőjel szabályok a név elején, közepén és végén
* - másodszintű közdomainek
* - védett nevek
* - zárolt nevek
*
* @param $host
* Host név, amely feltételezhetően egy érvényes .hu domain névhez tartozik.
* @param $error
* Referencia szerint átadva. Hibaüzenet, ha a host nem .hu domain része.
* @return
* A domain név (string) amihez a $host tartozik, vagy FALSE ha téves.
*/
function domain_from_host($host, &$error = NULL) {
$level2 = array(
'co', 'info', 'org', 'priv', 'sport', 'tm', '2000', 'agrar',
'bolt', 'casino', 'city', 'erotica', 'erotika', 'film', 'forum', 'games',
'hotel', 'ingatlan', 'jogasz', 'konyvelo', 'lakas', 'media', 'news',
'reklam', 'sex', 'shop', 'suli', 'szex', 'tozsde', 'utazas', 'video',
);
$protected = array(
'ac', 'arpa', 'biz', 'co', 'com', 'dns', 'email', 'e-mail', 'firm', 'ftp',
'gov', 'ind', 'info', 'internet', 'iskola', 'mail', 'mx', 'net', 'nom',
'ns', 'nui', 'org', 'pp', 'priv', 'sport', 'tm', 'web', 'www',
);
$closed = array(
'accomodation.hu', 'aruhaz.hu', 'aukcio.hu', 'auto.hu', 'befektetes.hu',
'bor.hu', 'broker.hu', 'business.hu', 'butor.hu', 'cash.hu', 'credit.hu',
'house.hu', 'jacht.hu', 'kamat.hu', 'konyv.hu', 'magazin.hu', 'oras.hu',
'orszag.hu', 'pc.hu', 'search.hu', 'szabadido.hu', 'telek.hu', 'trade.hu',
'translation.hu', 'travel.hu', 'turizmus.hu', 'voip.hu', 'vpn.hu',
);
$error = NULL;
if (preg_match('/^[a-z0-9\\á\é\í\ó\ö\ő\ú\ü\ű\-\.]+$/', $host) !== 1) {
$error = 'Invalid characters';
return FALSE;
}
$parts = array_reverse(explode('.', $host));
if (count($parts) < 2) {
$error = 'Invalid format.';
return FALSE;
}
if ($parts[0] !== 'hu') {
$error = 'Not .hu domain.';
return FALSE;
}
if (in_array($parts[1] .'.'. $parts[0], $closed)) {
$error = 'Closed domain.';
return FALSE;
}
if (in_array($parts[1], $level2)) {
if (isset($parts[2])) {
$name = $parts[2];
$suffix = '.'. $parts[1] .'.hu';
}
else {
$error = 'Second level domain.';
return FALSE;
}
}
else {
$name = $parts[1];
$suffix = '.hu';
}
if (in_array($name, $protected) && !in_array($name . $suffix, array('internet.hu', 'net.hu'))) {
$error = 'Protected name.';
return FALSE;
}
if (mb_strlen($name) < 2) {
$error = 'Domain too short.';
return FALSE;
}
if (mb_strlen($name) > 40) {
$error = 'Domain too long.';
return FALSE;
}
if ($name[0] == '-') {
$error = 'Name stats with \'-\' character.';
return FALSE;
}
if ($name[strlen($name) - 1] == '-') {
$error = 'Name ends with \'-\' character.';
return FALSE;
}
$before_needle = strstr($name, '--', TRUE);
if ($before_needle === 'xn') {
$before_needle = strstr(substr($name, 4), '--');
}
if ($before_needle !== FALSE) {
$error = 'Double minus (\'--\') character found.';
return FALSE;
}
return $name . $suffix;
}
?>
Ha hibákért és a használatból eredő károkért nem vállalok felelősséget. Viszont ha megírjátok a hibát kommentben, akkor javítani, ha tudom.