78 if (!empty($params) && is_array($params)) {
79 if (isset($params[
'encoding'])) {
83 if (isset($params[
'idn_version'])) {
87 if (isset($params[
'strict_mode'])) {
120 throw new \InvalidArgumentException(sprintf(
'Invalid encoding %s',
$encoding));
164 throw new \InvalidArgumentException(sprintf(
'Invalid IDN version %d',
$idnVersion));
174 public function decode($input, $one_time_encoding =
null)
179 if ($one_time_encoding) {
180 switch ($one_time_encoding) {
186 throw new \InvalidArgumentException(sprintf(
'Invalid encoding %s', $one_time_encoding));
190 $input = trim($input);
194 if (strpos($input,
'@')) {
196 if ($this->strictMode) {
197 throw new \InvalidArgumentException(
'Only individual domain name parts can be handled in strict mode');
199 list($email_pref, $input) = explode(
'@', $input, 2);
200 $arr = explode(
'.', $input);
201 foreach ($arr as $k => $v) {
202 $conv = $punyCode->decode($v);
207 $input = implode(
'.', $arr);
208 $arr = explode(
'.', $email_pref);
209 foreach ($arr as $k => $v) {
210 $conv = $punyCode->decode($v);
215 $email_pref = implode(
'.', $arr);
216 $return = $email_pref .
'@' . $input;
217 } elseif (preg_match(
'![:\./]!', $input)) {
219 if ($this->strictMode) {
220 throw new \InvalidArgumentException(
'Only individual domain name parts can be handled in strict mode');
222 $parsed = parse_url($input);
223 if (isset($parsed[
'host'])) {
224 $arr = explode(
'.', $parsed[
'host']);
225 foreach ($arr as $k => $v) {
226 $conv = $punyCode->decode($v);
231 $parsed[
'host'] = implode(
'.', $arr);
232 $return = (empty($parsed[
'scheme']) ?
'' : $parsed[
'scheme'] . (strtolower($parsed[
'scheme']) ==
'mailto' ?
':' :
'://')) .
233 (empty($parsed[
'user']) ?
'' : $parsed[
'user'] . (empty($parsed[
'pass']) ?
'' :
':' . $parsed[
'pass']) .
'@') .
235 (empty($parsed[
'port']) ?
'' :
':' . $parsed[
'port']) .
236 (empty($parsed[
'path']) ?
'' : $parsed[
'path']) .
237 (empty($parsed[
'query']) ?
'' :
'?' . $parsed[
'query']) .
238 (empty($parsed[
'fragment']) ?
'' :
'#' . $parsed[
'fragment']);
240 $arr = explode(
'.', $input);
241 foreach ($arr as $k => $v) {
242 $conv = $punyCode->decode($v);
247 $return = implode(
'.', $arr);
250 $return = $punyCode->decode($input);
257 $outputEncoding = ($one_time_encoding) ? $one_time_encoding : $this->encoding;
258 switch ($outputEncoding) {
266 throw new \InvalidArgumentException(sprintf(
'Unsupported output encoding %s', $outputEncoding));
276 public function encode($decoded, $one_time_encoding =
false)
280 $inputEncoding = $one_time_encoding ? $one_time_encoding :
$this->encoding;
281 switch ($inputEncoding) {
291 throw new \InvalidArgumentException(sprintf(
'Unsupported input encoding %s', $inputEncoding));
295 if (empty($decoded)) {
305 foreach ($decoded as $k => $v) {
321 if ($this->strictMode) {
322 throw new \InvalidArgumentException(
'Neither email addresses nor URLs are allowed in strict mode.');
326 $encoded = $punyCode->encode(array_slice($decoded, $last_begin, (($k) - $last_begin)));
334 $last_begin = $k + 1;
340 $inp_len = count($decoded);
341 $encoded = $punyCode->encode(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
349 if (
false !== (
$output = $punyCode->encode($decoded))) {
364 $parsed = parse_url($uri);
365 if (!isset($parsed[
'host'])) {
366 throw new \InvalidArgumentException(
'The given string does not look like a URI');
368 $arr = explode(
'.', $parsed[
'host']);
369 foreach ($arr as $k => $v) {
370 $conv = $this->
encode($v,
'utf8');
375 $parsed[
'host'] = implode(
'.', $arr);
376 $return = (empty($parsed[
'scheme']) ?
'' : $parsed[
'scheme'] . (strtolower($parsed[
'scheme']) ==
'mailto' ?
':' :
'://')) .
377 (empty($parsed[
'user']) ?
'' : $parsed[
'user'] . (empty($parsed[
'pass']) ?
'' :
':' . $parsed[
'pass']) .
'@') .
379 (empty($parsed[
'port']) ?
'' :
':' . $parsed[
'port']) .
380 (empty($parsed[
'path']) ?
'' : $parsed[
'path']) .
381 (empty($parsed[
'query']) ?
'' :
'?' . $parsed[
'query']) .
382 (empty($parsed[
'fragment']) ?
'' :
'#' . $parsed[
'fragment']);
394 static $instances = [];
396 if (!isset($instances[$this->idnVersion])) {