Multibyte strtr() → mb_strtr()
Кто-нибудь написал многобайтовый вариант функции strtr()? Мне нужен этот.
Изменить 1 (пример желаемого использования):
Example:
$from = 'ľľščťžýáíŕďňäô'; // these chars are in UTF-8
$to = 'llsctzyaiŕdnao';
// input - in UTF-8
$str = 'Kŕdeľ ďatľov učí koňa žrať kôru.';
$str = mb_strtr( $str, $from, $to );
// output - str without diacritic
// $str = 'Krdel datlov uci kona zrat koru.';
Ответы
Ответ 1
Я считаю, что 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('~&([a-z]{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
Ответ 2
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;
}
Ответ 3
Вероятно, использование 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.