multibyte strtr () -> mb_strtr ()

Кто-нибудь написал многобайтовый вариант функции strtr ()? Мне нужен этот.

Изменить 1 (пример желаемого использования):

 Пример:
 $ from = 'ľľščťžýáíŕďňäô';  // эти символы находятся в UTF-8
 $ to = 'llsctzyaiŕdnao';

 // ввод - в UTF-8
 $ str = 'Kŕdeľ ďatľov učí koňa žrať kôru.';
 $ str = mb_strtr ($ str, $ from, $ to);

 // output - str без диакритического
 // $ str = 'Krdel datlov uci kona zrat koru.';

Я считаю, что strtr является многобайтовым , так как str_replace – это многобайтовый сейф, который вы можете его обернуть:

 function mb_strtr($str, $from, $to) { return str_replace(mb_str_split($from), mb_str_split($to), $str); } 

Поскольку нет функции mb_str_split вам также нужно написать свой собственный (используя mb_substr и mb_strlen ), или вы можете просто использовать реализацию PHP UTF-8 (слегка изменились):

 function mb_str_split($str) { return preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY);; } 

Однако, если вы ищете функцию для удаления всех (латинских?) Акцентуаций из строки, вы можете найти следующую полезную функцию:

 function Unaccent($string) { return preg_replace('~&([az]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')); } echo Unaccent('ľľščťžýáíŕďňä'); // llsctzyairdna echo Unaccent('Iñtërnâtiônàlizætiøn'); // Internationalizaetion 
 function mb_strtr($str,$map,$enc){ $out=""; $strLn=mb_strlen($str,$enc); $maxKeyLn=1; foreach($map as $key=>$val){ $keyLn=mb_strlen($key,$enc); if($keyLn>$maxKeyLn){ $maxKeyLn=$keyLn; } } for($offset=0; $offset<$strLn; ){ for($ln=$maxKeyLn; $ln>=1; $ln--){ $cmp=mb_substr($str,$offset,$ln,$enc); if(isset($map[$cmp])){ $out.=$map[$cmp]; $offset+=$ln; continue 2; } } $out.=mb_substr($str,$offset,1,$enc); $offset++; } return $out; } 

Вероятно, использование str_replace является хорошим решением. Альтернатива:

 <?php header('Content-Type: text/plain;charset=utf-8'); function my_strtr($inputStr, $from, $to, $encoding = 'UTF-8') { $inputStrLength = mb_strlen($inputStr, $encoding); $translated = ''; for($i = 0; $i < $inputStrLength; $i++) { $currentChar = mb_substr($inputStr, $i, 1, $encoding); $translatedCharPos = mb_strpos($from, $currentChar, 0, $encoding); if($translatedCharPos === false) { $translated .= $currentChar; } else { $translated .= mb_substr($to, $translatedCharPos, 1, $encoding); } } return $translated; } $from = 'ľľščťžýáíŕďňä'; // these chars are in UTF-8 $to = 'llsctzyairdna'; // input - in UTF-8 $str = 'Kŕdeľ ďatľov učí koňa žrať kôru.'; print 'Original: '; print chr(10); print $str; print chr(10); print chr(10); print 'Tranlated: '; print chr(10); print my_strtr( $str, $from, $to); 

Печать на моей машине с использованием PHP 5.2:

 Original: Kŕdeľ ďatľov učí koňa žrať kôru. Tranlated: Krdel datlov uci kona zrat kôru.