13

関数strtr()のマルチバイトバリアントを書いた人はいますか?これが必要です。

編集1(望ましい使用法の例):

例:
$ from='ľľščťžýáíŕďňäô'; //これらの文字はUTF-8にあります
$ to='llsctzyaiŕdnao';

//入力-UTF-8で
$ str='Kŕdeľďatľovučíkoňažraťkôru。';
$ str = mb_strtr($ str、$ from、$ to);

//出力-発音区別符号なしのstr
// $ str ='Krdel datlov uci konazratkoru。';
4

3 に答える 3

27

マルチバイトセーフであるとは信じて います。どちらにしても、マルチバイトセーフであるため、ラップすることができます。strtrstr_replace

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

関数がないmb_str_splitため、独自の関数を作成する必要があります(mb_substrandを使用)。または、 PHP UTF-8実装mb_strlenを使用することもできます(わずかに変更)。

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
于 2010-05-03T15:33:50.633 に答える
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;
}
于 2010-08-11T23:01:50.040 に答える
1

おそらく 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.
于 2010-05-03T15:43:09.863 に答える