34 {
35 $length = strlen($string);
36
37
38
39
40
41
42 if ($string === '') {
43 return '';
44 }
45 if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
46
47 $ip = substr($string, 1, $length - 2);
48 $valid = $this->ipv6->validate($ip, $config, $context);
50 return false;
51 }
53 }
54
55
56 $ipv4 = $this->ipv4->validate($string, $config, $context);
57 if (
$ipv4 !==
false) {
59 }
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
78
79
80 $a = '[a-z]';
81 $an = '[a-z0-9]';
82 $and = "[a-z0-9-$underscore]";
83
84 $domainlabel = "$an($and*$an)?";
85
86 $toplabel = "$a($and*$an)?";
87
88 if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
89 return $string;
90 }
91
92
93
94
95
96 if (function_exists('idn_to_ascii')) {
97 return idn_to_ascii($string);
98
99
100
101 } elseif ($config->get('Core.EnableIDNA')) {
102
103 $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
104
105 $parts = explode('.', $string);
106 try {
107 $new_parts = array();
108 foreach ($parts as $part) {
109 $encodable = false;
110 for ($i = 0, $c = strlen($part); $i < $c; $i++) {
111 if (ord($part[$i]) > 0x7a) {
112 $encodable = true;
113 break;
114 }
115 }
116 if (!$encodable) {
117 $new_parts[] = $part;
118 } else {
119 $new_parts[] = $idna->encode($part);
120 }
121 }
122 $string = implode('.', $new_parts);
123 if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
124 return $string;
125 }
126 } catch (Exception $e) {
127
128 }
129 }
130 return false;
131 }