1

32文字を超える文字列を「...」に置き換える次の関数があります。私の問題は、ウムラウトが 29 番目から 33 番目の文字の範囲にある場合、奇妙な文字で表されることです。変数 $length に入れる数値の長さにもかかわらず、ウムラウト全体を壊さずに表示するように関数を変更するにはどうすればよいですか?

たとえば、für の前に 31 文字ありますが、以下の関数を使用すると、31 文字プラス für が得られます。

function textLimit($string, $length, $replacer = '...')
{
  if(strlen($string) > $length)
  return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;

  return $string;
}
4

1 に答える 1

1

UTF-8 文字列と両方を使用しているようですがstrlensubstrあなたpreg_matchはこれを認識していません。文字列関数の場合、これを使用する必要があります:

http://www.php.net/manual/en/ref.mbstring.php

次の例は、UTF-8 文字列で動作するはずです (mb 関数と u preg 修飾子に注意してください)。

function textLimit($string, $length, $replacer = '...') {
  if(mb_strlen($string) > $length) {
    return (preg_match('/^(.*)\W.*$/u', mb_substr($string, 0, $length+1), $matches) ? $matches[1] : mb_substr($string, 0, $length)) . $replacer;
  }

  return $string;
}

mb_internal_encoding('UTF-8');
echo 'example: '.textLimit('füüür', 2)."\n";

出力:

example: fü...
于 2012-11-21T12:55:04.400 に答える