private static function mapFromUtf8(&$result, $map, $str, $ignore, $translit)
 {
     $ulenMask = self::$ulenMask;
     $valid = self::$isValidUtf8;
     if ($translit && !self::$translitMap) {
         self::$translitMap = self::getData('translit');
     }
     $i = 0;
     $len = strlen($str);
     while ($i < $len) {
         if ($str[$i] < "€") {
             $uchr = $str[$i++];
         } else {
             $ulen = $str[$i] & "№";
             $ulen = isset($ulenMask[$ulen]) ? $ulenMask[$ulen] : 1;
             $uchr = substr($str, $i, $ulen);
             if ($ignore && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))) {
                 ++$i;
                 continue;
             } else {
                 $i += $ulen;
             }
         }
         if (isset($map[$uchr])) {
             $result .= $map[$uchr];
         } elseif ($translit) {
             if (isset(self::$translitMap[$uchr])) {
                 $uchr = self::$translitMap[$uchr];
             } elseif ($uchr >= "У€") {
                 $uchr = \Normalizer::normalize($uchr, \Normalizer::NFD);
                 if ($uchr[0] < "€") {
                     $uchr = $uchr[0];
                 } elseif ($ignore) {
                     continue;
                 } else {
                     return false;
                 }
             }
             $str = $uchr . substr($str, $i);
             $len = strlen($str);
             $i = 0;
         } elseif (!$ignore) {
             return false;
         }
     }
     return true;
 }
Exemple #2
0
 protected static function map_from_utf8(&$result, $map, $str, $IGNORE, $TRANSLIT)
 {
     $ulen_mask = self::$ulen_mask;
     $valid = self::$is_valid_utf8;
     if ($TRANSLIT) {
         self::$translit_map or self::$translit_map = self::getData('translit');
     }
     $i = 0;
     $len = strlen($str);
     while ($i < $len) {
         if ($str[$i] < "€") {
             $uchr = $str[$i++];
         } else {
             $ulen = $str[$i] & "ð";
             $ulen = isset($ulen_mask[$ulen]) ? $ulen_mask[$ulen] : 1;
             $uchr = substr($str, $i, $ulen);
             if ($IGNORE && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))) {
                 ++$i;
                 continue;
             } else {
                 $i += $ulen;
             }
         }
         if (isset($map[$uchr])) {
             $result .= $map[$uchr];
         } else {
             if ($TRANSLIT) {
                 if (isset(self::$translit_map[$uchr])) {
                     $uchr = self::$translit_map[$uchr];
                 } else {
                     if ($uchr >= "À") {
                         $uchr = \Normalizer::normalize($uchr, \Normalizer::NFD);
                         $uchr = preg_split('/(.)/', $uchr, 2, PREG_SPLIT_DELIM_CAPTURE);
                         if (isset($uchr[2][0])) {
                             $uchr = $uchr[1];
                         } else {
                             if ($IGNORE) {
                                 continue;
                             } else {
                                 return false;
                             }
                         }
                     }
                 }
                 $str = $uchr . substr($str, $i);
                 $len = strlen($str);
                 $i = 0;
             } else {
                 if (!$IGNORE) {
                     return false;
                 }
             }
         }
     }
     return true;
 }