25 #require_once 'Zend/Validate/Abstract.php'; 30 #require_once 'Zend/Validate/Ip.php'; 65 self::CANNOT_DECODE_PUNYCODE =>
"'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded",
66 self::INVALID =>
"Invalid type given. String expected",
67 self::INVALID_DASH =>
"'%value%' appears to be a DNS hostname but contains a dash in an invalid position",
68 self::INVALID_HOSTNAME =>
"'%value%' does not match the expected structure for a DNS hostname",
69 self::INVALID_HOSTNAME_SCHEMA =>
"'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'",
70 self::INVALID_LOCAL_NAME =>
"'%value%' does not appear to be a valid local network name",
71 self::INVALID_URI =>
"'%value%' does not appear to be a valid URI hostname",
72 self::IP_ADDRESS_NOT_ALLOWED =>
"'%value%' appears to be an IP address, but IP addresses are not allowed",
73 self::LOCAL_NAME_NOT_ALLOWED =>
"'%value%' appears to be a local network name but local network names are not allowed",
74 self::UNDECIPHERABLE_TLD =>
"'%value%' appears to be a DNS hostname but cannot extract TLD part",
75 self::UNKNOWN_TLD =>
"'%value%' appears to be a DNS hostname but cannot match TLD against known list",
1111 'xn--clchc0ea0b2g2a9gcd',
1151 'xn--mgberp4a5d4ar',
1175 'xn--vermgensberater-ctb',
1176 'xn--vermgensberatung-pwb',
1183 'xn--xkc2dl3a5ee0h',
1288 'vermögensberatung',
1361 'AC' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'),
1362 'AR' => array(1 =>
'/^[\x{002d}0-9a-zà-ãç-êìíñ-õü]{1,63}$/iu'),
1363 'AS' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$/iu'),
1364 'AT' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿœšž]{1,63}$/iu'),
1365 'BIZ' =>
'Hostname/Biz.php',
1366 'BR' => array(1 =>
'/^[\x{002d}0-9a-zà-ãçéíó-õúü]{1,63}$/iu'),
1367 'BV' => array(1 =>
'/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'),
1368 'CA' => array(1 =>
'/^[\x{002d}0-9a-zàâæçéèêëîïôœùûüÿ\x{00E0}\x{00E2}\x{00E7}\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{00EE}\x{00EF}\x{00F4}\x{00F9}\x{00FB}\x{00FC}\x{00E6}\x{0153}\x{00FF}]{1,63}$/iu'),
1369 'CAT' => array(1 =>
'/^[\x{002d}0-9a-z·àç-éíïòóúü]{1,63}$/iu'),
1370 'CH' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'),
1371 'CL' => array(1 =>
'/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'),
1372 'CN' =>
'Hostname/Cn.php',
1373 'COM' =>
'Hostname/Com.php',
1374 'DE' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťßţŧŭůűũųūŵŷźžż]{1,63}$/iu'),
1375 'DK' => array(1 =>
'/^[\x{002d}0-9a-zäéöüæøå]{1,63}$/iu'),
1376 'ES' => array(1 =>
'/^[\x{002d}0-9a-zàáçèéíïñòóúü·]{1,63}$/iu'),
1377 'EU' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu',
1378 2 =>
'/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu',
1379 3 =>
'/^[\x{002d}0-9a-zșț]{1,63}$/iu',
1380 4 =>
'/^[\x{002d}0-9a-zΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ]{1,63}$/iu',
1381 5 =>
'/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]{1,63}$/iu',
1382 6 =>
'/^[\x{002d}0-9a-zἀ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ὼώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷῂῃῄῆῇῐ-ῒΐῖῗῠ-ῧῲῳῴῶῷ]{1,63}$/iu'),
1383 'FI' => array(1 =>
'/^[\x{002d}0-9a-zäåö]{1,63}$/iu'),
1384 'GR' => array(1 =>
'/^[\x{002d}0-9a-zΆΈΉΊΌΎ-ΡΣ-ώἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼῂῃῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲῳῴῶ-ῼ]{1,63}$/iu'),
1385 'HK' =>
'Hostname/Cn.php',
1386 'HU' => array(1 =>
'/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu'),
1387 'IL' => array(1 =>
'/^[\x{002d}0-9\x{05D0}-\x{05EA}]{1,63}$/iu',
1388 2 =>
'/^[\x{002d}0-9a-z]{1,63}$/i'),
1389 'INFO'=> array(1 =>
'/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu',
1390 2 =>
'/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu',
1391 3 =>
'/^[\x{002d}0-9a-záæéíðóöúýþ]{1,63}$/iu',
1392 4 =>
'/^[\x{AC00}-\x{D7A3}]{1,17}$/iu',
1393 5 =>
'/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
1394 6 =>
'/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
1395 7 =>
'/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
1396 8 =>
'/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu'),
1397 'IO' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'),
1398 'IS' => array(1 =>
'/^[\x{002d}0-9a-záéýúíóþæöð]{1,63}$/iu'),
1399 'IT' => array(1 =>
'/^[\x{002d}0-9a-zàâäèéêëìîïòôöùûüæœçÿß-]{1,63}$/iu'),
1400 'JP' =>
'Hostname/Jp.php',
1401 'KR' => array(1 =>
'/^[\x{AC00}-\x{D7A3}]{1,17}$/iu'),
1402 'LI' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿœ]{1,63}$/iu'),
1403 'LT' => array(1 =>
'/^[\x{002d}0-9ąčęėįšųūž]{1,63}$/iu'),
1404 'MD' => array(1 =>
'/^[\x{002d}0-9ăâîşţ]{1,63}$/iu'),
1405 'MUSEUM' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿāăąćċčďđēėęěğġģħīįıķĺļľłńņňŋōőœŕŗřśşšţťŧūůűųŵŷźżžǎǐǒǔ\x{01E5}\x{01E7}\x{01E9}\x{01EF}ə\x{0292}ẁẃẅỳ]{1,63}$/iu'),
1406 'NET' =>
'Hostname/Com.php',
1407 'NO' => array(1 =>
'/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'),
1408 'NU' =>
'Hostname/Com.php',
1409 'ORG' => array(1 =>
'/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
1410 2 =>
'/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
1411 3 =>
'/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu',
1412 4 =>
'/^[\x{002d}0-9a-záéíóöúüőű]{1,63}$/iu',
1413 5 =>
'/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
1414 6 =>
'/^[\x{AC00}-\x{D7A3}]{1,17}$/iu',
1415 7 =>
'/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu'),
1416 'PE' => array(1 =>
'/^[\x{002d}0-9a-zñáéíóúü]{1,63}$/iu'),
1417 'PL' => array(1 =>
'/^[\x{002d}0-9a-zāčēģīķļņōŗšūž]{1,63}$/iu',
1418 2 =>
'/^[\x{002d}а-ик-ш\x{0450}ѓѕјљњќџ]{1,63}$/iu',
1419 3 =>
'/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu',
1420 4 =>
'/^[\x{002d}0-9а-яё\x{04C2}]{1,63}$/iu',
1421 5 =>
'/^[\x{002d}0-9a-zàáâèéêìíîòóôùúûċġħż]{1,63}$/iu',
1422 6 =>
'/^[\x{002d}0-9a-zàäåæéêòóôöøü]{1,63}$/iu',
1423 7 =>
'/^[\x{002d}0-9a-zóąćęłńśźż]{1,63}$/iu',
1424 8 =>
'/^[\x{002d}0-9a-zàáâãçéêíòóôõúü]{1,63}$/iu',
1425 9 =>
'/^[\x{002d}0-9a-zâîăşţ]{1,63}$/iu',
1426 10=>
'/^[\x{002d}0-9a-záäéíóôúýčďĺľňŕšťž]{1,63}$/iu',
1427 11=>
'/^[\x{002d}0-9a-zçë]{1,63}$/iu',
1428 12=>
'/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu',
1429 13=>
'/^[\x{002d}0-9a-zćčđšž]{1,63}$/iu',
1430 14=>
'/^[\x{002d}0-9a-zâçöûüğış]{1,63}$/iu',
1431 15=>
'/^[\x{002d}0-9a-záéíñóúü]{1,63}$/iu',
1432 16=>
'/^[\x{002d}0-9a-zäõöüšž]{1,63}$/iu',
1433 17=>
'/^[\x{002d}0-9a-zĉĝĥĵŝŭ]{1,63}$/iu',
1434 18=>
'/^[\x{002d}0-9a-zâäéëîô]{1,63}$/iu',
1435 19=>
'/^[\x{002d}0-9a-zàáâäåæçèéêëìíîïðñòôöøùúûüýćčłńřśš]{1,63}$/iu',
1436 20=>
'/^[\x{002d}0-9a-zäåæõöøüšž]{1,63}$/iu',
1437 21=>
'/^[\x{002d}0-9a-zàáçèéìíòóùú]{1,63}$/iu',
1438 22=>
'/^[\x{002d}0-9a-zàáéíóöúüőű]{1,63}$/iu',
1439 23=>
'/^[\x{002d}0-9ΐά-ώ]{1,63}$/iu',
1440 24=>
'/^[\x{002d}0-9a-zàáâåæçèéêëðóôöøüþœ]{1,63}$/iu',
1441 25=>
'/^[\x{002d}0-9a-záäéíóöúüýčďěňřšťůž]{1,63}$/iu',
1442 26=>
'/^[\x{002d}0-9a-z·àçèéíïòóúü]{1,63}$/iu',
1443 27=>
'/^[\x{002d}0-9а-ъьюя\x{0450}\x{045D}]{1,63}$/iu',
1444 28=>
'/^[\x{002d}0-9а-яёіў]{1,63}$/iu',
1445 29=>
'/^[\x{002d}0-9a-ząčėęįšūųž]{1,63}$/iu',
1446 30=>
'/^[\x{002d}0-9a-záäåæéëíðóöøúüýþ]{1,63}$/iu',
1447 31=>
'/^[\x{002d}0-9a-zàâæçèéêëîïñôùûüÿœ]{1,63}$/iu',
1448 32=>
'/^[\x{002d}0-9а-щъыьэюяёєіїґ]{1,63}$/iu',
1449 33=>
'/^[\x{002d}0-9א-ת]{1,63}$/iu'),
1450 'PR' => array(1 =>
'/^[\x{002d}0-9a-záéíóúñäëïüöâêîôûàèùæçœãõ]{1,63}$/iu'),
1451 'PT' => array(1 =>
'/^[\x{002d}0-9a-záàâãçéêíóôõú]{1,63}$/iu'),
1452 'RS' => array(1 =>
'/^[\x{002D}\x{0030}-\x{0039}\x{0061}-\x{007A}\x{0107}\x{010D}\x{0111}\x{0161}\x{017E}]{1,63}$/iu)'),
1453 'RU' => array(1 =>
'/^[\x{002d}0-9а-яё]{1,63}$/iu'),
1454 'SA' => array(1 =>
'/^[\x{002d}.0-9\x{0621}-\x{063A}\x{0641}-\x{064A}\x{0660}-\x{0669}]{1,63}$/iu'),
1455 'SE' => array(1 =>
'/^[\x{002d}0-9a-zäåéöü]{1,63}$/iu'),
1456 'SH' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿăąāćĉčċďđĕěėęēğĝġģĥħĭĩįīıĵķĺľļłńňņŋŏőōœĸŕřŗśŝšşťţŧŭůűũųūŵŷźžż]{1,63}$/iu'),
1458 1 =>
'/^[\x{002d}0-9a-zà-öø-ÿ]{1,63}$/iu',
1459 2 =>
'/^[\x{002d}0-9a-zāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĺļľŀłńņňʼnŋōŏőœŕŗřśŝšťŧũūŭůűųŵŷźżž]{1,63}$/iu',
1460 3 =>
'/^[\x{002d}0-9a-zșț]{1,63}$/iu'),
1461 'SJ' => array(1 =>
'/^[\x{002d}0-9a-zàáä-éêñ-ôöøüčđńŋšŧž]{1,63}$/iu'),
1462 'TH' => array(1 =>
'/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'),
1463 'TM' => array(1 =>
'/^[\x{002d}0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$/iu'),
1464 'TW' =>
'Hostname/Cn.php',
1465 'TR' => array(1 =>
'/^[\x{002d}0-9a-zğıüşöç]{1,63}$/iu'),
1466 'UA' => array(1 =>
'/^[\x{002d}0-9a-zабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџґӂʼ]{1,63}$/iu'),
1467 'VE' => array(1 =>
'/^[\x{002d}0-9a-záéíóúüñ]{1,63}$/iu'),
1468 'VN' => array(1 =>
'/^[ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíòóôõùúýĂăĐđĨĩŨũƠơƯư\x{1EA0}-\x{1EF9}]{1,63}$/iu'),
1469 'мон' => array(1 =>
'/^[\x{002d}0-9\x{0430}-\x{044F}]{1,63}$/iu'),
1470 'срб' => array(1 =>
'/^[\x{002d}0-9а-ик-шђјљњћџ]{1,63}$/iu'),
1471 'сайт' => array(1 =>
'/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'),
1472 'онлайн' => array(1 =>
'/^[\x{002d}0-9а-яёіїѝйўґг]{1,63}$/iu'),
1473 '中国' =>
'Hostname/Cn.php',
1474 '中國' =>
'Hostname/Cn.php',
1475 'ලංකා' => array(1 =>
'/^[\x{0d80}-\x{0dff}]{1,63}$/iu'),
1476 '香港' =>
'Hostname/Cn.php',
1477 '台湾' =>
'Hostname/Cn.php',
1478 '台灣' =>
'Hostname/Cn.php',
1479 'امارات' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1480 'الاردن' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1481 'السعودية' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1482 'ไทย' => array(1 =>
'/^[\x{002d}0-9a-z\x{0E01}-\x{0E3A}\x{0E40}-\x{0E4D}\x{0E50}-\x{0E59}]{1,63}$/iu'),
1483 'рф' => array(1 =>
'/^[\x{002d}0-9а-яё]{1,63}$/iu'),
1484 'تونس' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1485 'مصر' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1486 'இலங்கை' => array(1 =>
'/^[\x{0b80}-\x{0bff}]{1,63}$/iu'),
1487 'فلسطين' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1488 'شبكة' => array(1 =>
'/^[\x{0621}-\x{0624}\x{0626}-\x{063A}\x{0641}\x{0642}\x{0644}-\x{0648}\x{067E}\x{0686}\x{0698}\x{06A9}\x{06AF}\x{06CC}\x{06F0}-\x{06F9}]{1,30}$/iu'),
1492 'BIZ' => array(5 => 17, 11 => 15, 12 => 20),
1493 'CN' => array(1 => 20),
1494 'COM' => array(3 => 17, 5 => 20),
1495 'HK' => array(1 => 15),
1496 'INFO'=> array(4 => 17),
1497 'KR' => array(1 => 17),
1498 'NET' => array(3 => 17, 5 => 20),
1499 'ORG' => array(6 => 17),
1500 'TW' => array(1 => 20),
1501 'ایران' => array(1 => 30),
1502 '中国' => array(1 => 20),
1503 '公司' => array(1 => 20),
1504 '网络' => array(1 => 20),
1508 'allow' => self::ALLOW_DNS,
1526 $temp[
'allow'] = array_shift(
$options);
1528 $temp[
'idn'] = array_shift(
$options);
1532 $temp[
'tld'] = array_shift(
$options);
1536 $temp[
'ip'] = array_shift(
$options);
1564 if (array_key_exists(
'allow',
$options)) {
1568 if (array_key_exists(
'idn',
$options)) {
1572 if (array_key_exists(
'tld',
$options)) {
1576 if (array_key_exists(
'ip',
$options)) {
1590 return $this->_options[
'ip'];
1599 if ($ipValidator ===
null) {
1603 $this->_options[
'ip'] = $ipValidator;
1614 return $this->_options[
'allow'];
1625 $this->_options[
'allow'] = $allow;
1636 return $this->_options[
'idn'];
1649 $this->_options[
'idn'] = (bool) $allowed;
1660 return $this->_options[
'tld'];
1673 $this->_options[
'tld'] = (bool) $allowed;
1688 if (!is_string(
$value)) {
1689 $this->
_error(self::INVALID);
1695 if (preg_match(
'/^[0-9a-f:.]*$/i',
$value) &&
1697 if (!($this->_options[
'allow'] & self::ALLOW_IP)) {
1698 $this->
_error(self::IP_ADDRESS_NOT_ALLOWED);
1715 if ($this->_options[
'allow'] & self::ALLOW_LOCAL) {
1716 if (substr(
$value, -1) ===
'.') {
1718 if (substr(
$value, -1) ===
'.') {
1720 $this->
_error(self::INVALID_LOCAL_NAME);
1726 $domainParts = explode(
'.',
$value);
1729 if ((count($domainParts) == 4) && preg_match(
'/^[0-9.a-e:.]*$/i',
$value) &&
1731 $this->
_error(self::INVALID_LOCAL_NAME);
1735 if ((count($domainParts) > 1) && (strlen(
$value) >= 4) && (strlen(
$value) <= 254)) {
1738 $origenc = PHP_VERSION_ID < 50600
1739 ? iconv_get_encoding(
'internal_encoding')
1741 if (PHP_VERSION_ID < 50600) {
1742 iconv_set_encoding(
'internal_encoding',
'UTF-8');
1744 ini_set(
'default_charset',
'UTF-8');
1749 if (preg_match(
'/([^.]{2,63})$/iu', end($domainParts), $matches)
1750 || (array_key_exists(end($domainParts), $this->_validIdns))) {
1751 reset($domainParts);
1759 $this->_tld = $matches[1];
1760 if ($this->_options[
'tld']) {
1761 if (!in_array(strtolower($this->_tld), $this->_validTlds)
1762 && !in_array($this->_tld, $this->_validTlds)) {
1763 $this->
_error(self::UNKNOWN_TLD);
1769 array_pop($domainParts);
1777 $regexChars = array(0 =>
'/^[a-z0-9\x2d]{1,63}$/i');
1778 if ($this->_options[
'idn'] && isset($this->_validIdns[strtoupper($this->_tld)])) {
1779 if (is_string($this->_validIdns[strtoupper($this->_tld)])) {
1780 $regexChars += include($this->_validIdns[strtoupper($this->_tld)]);
1782 $regexChars += $this->_validIdns[strtoupper($this->_tld)];
1788 foreach ($domainParts as $domainPart) {
1790 if (empty($domainPart) && $domainPart !==
'0') {
1791 $this->
_error(self::INVALID_HOSTNAME);
1796 if (strpos($domainPart,
'xn--') === 0) {
1798 if ($domainPart ===
false) {
1804 if ((strpos($domainPart,
'-') === 0)
1805 || ((strlen($domainPart) > 2) && (strpos($domainPart,
'-', 2) == 2) && (strpos($domainPart,
'-', 3) == 3))
1806 || (strpos($domainPart,
'-') === (strlen($domainPart) - 1))) {
1807 $this->
_error(self::INVALID_DASH);
1814 foreach($regexChars as $regexKey => $regexChar) {
1815 $status = preg_match($regexChar, $domainPart);
1818 if (array_key_exists(strtoupper($this->_tld), $this->_idnLength)
1819 && (array_key_exists($regexKey, $this->_idnLength[strtoupper($this->_tld)]))) {
1820 $length = $this->_idnLength[strtoupper($this->_tld)];
1823 if (iconv_strlen($domainPart,
'UTF-8') > $length) {
1824 $this->
_error(self::INVALID_HOSTNAME);
1838 if ($check !== count($domainParts)) {
1839 $this->
_error(self::INVALID_HOSTNAME_SCHEMA);
1844 $this->
_error(self::UNDECIPHERABLE_TLD);
1849 if (PHP_VERSION_ID < 50600) {
1850 iconv_set_encoding(
'internal_encoding', $origenc);
1852 ini_set(
'default_charset', $origenc);
1856 if (
$status && ($this->_options[
'allow'] & self::ALLOW_DNS)) {
1859 }
else if ($this->_options[
'allow'] & self::ALLOW_DNS) {
1860 $this->
_error(self::INVALID_HOSTNAME);
1864 if ($this->_options[
'allow'] & self::ALLOW_URI) {
1865 if (preg_match(
"/^([a-zA-Z0-9-._~!$&\'()*+,;=]|%[[:xdigit:]]{2}){1,254}$/i",
$value)) {
1868 $this->
_error(self::INVALID_URI);
1873 $regexLocal =
'/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}[\x2e]{0,1}){1,254}$/';
1885 $this->
_error(self::INVALID_LOCAL_NAME);
1889 if (
$status && !$allowLocal) {
1890 $this->
_error(self::LOCAL_NAME_NOT_ALLOWED);
1905 if (!preg_match(
'/^[a-z0-9-]+$/i', $encoded)) {
1907 $this->
_error(self::CANNOT_DECODE_PUNYCODE);
1912 $separator = strrpos($encoded,
'-');
1913 if ($separator > 0) {
1914 for ($x = 0; $x < $separator; ++$x) {
1916 $decoded[] = ord($encoded[$x]);
1920 $lengthd = count($decoded);
1921 $lengthe = strlen($encoded);
1929 for ($indexe = ($separator) ? ($separator + 1) : 0; $indexe < $lengthe; ++$lengthd) {
1930 for ($old_index =
$index,
$pos = 1, $key = 36; 1 ; $key += 36) {
1931 $hex = ord($encoded[$indexe++]);
1932 $digit = ($hex - 48 < 10) ? $hex - 22
1933 : (($hex - 65 < 26) ? $hex - 65
1934 : (($hex - 97 < 26) ? $hex - 97
1938 $tag = ($key <=
$base) ? 1 : (($key >=
$base + 26) ? 26 : ($key -
$base));
1939 if ($digit < $tag) {
1946 $delta = intval($init ? ((
$index - $old_index) / 700) : ((
$index - $old_index) / 2));
1947 $delta += intval($delta / ($lengthd + 1));
1948 for ($key = 0; $delta > 910 / 2; $key += 36) {
1949 $delta = intval($delta / 35);
1952 $base = intval($key + 36 * $delta / ($delta + 38));
1954 $char += (int) (
$index / ($lengthd + 1));
1955 $index %= ($lengthd + 1);
1958 $decoded[
$i] = $decoded[(
$i - 1)];
1962 $decoded[
$index++] = $char;
1966 foreach ($decoded as $key =>
$value) {
1968 $decoded[$key] = chr(
$value);
1970 $decoded[$key] = chr(192 + (
$value >> 6));
1971 $decoded[$key] .= chr(128 + (
$value & 63));
1973 $decoded[$key] = chr(224 + (
$value >> 12));
1974 $decoded[$key] .= chr(128 + ((
$value >> 6) & 63));
1975 $decoded[$key] .= chr(128 + (
$value & 63));
1977 $decoded[$key] = chr(240 + (
$value >> 18));
1978 $decoded[$key] .= chr(128 + ((
$value >> 12) & 63));
1979 $decoded[$key] .= chr(128 + ((
$value >> 6) & 63));
1980 $decoded[$key] .= chr(128 + (
$value & 63));
1982 $this->
_error(self::CANNOT_DECODE_PUNYCODE);
1987 return implode($decoded);
const INVALID_HOSTNAME_SCHEMA
ini_set($varName, $newValue)
elseif(isset( $params[ 'redirect_parent']))
_error($messageKey, $value=null)
const CANNOT_DECODE_PUNYCODE
__construct($options=array())
const IP_ADDRESS_NOT_ALLOWED
setIpValidator(Zend_Validate_Ip $ipValidator=null)
setTranslator($translator=null)
const LOCAL_NAME_NOT_ALLOWED