マルチバイトに対応したPHPのtrim関数を作ってみました。UTF-8環境を想定。
アスキー文字を幅1、マルチバイト文字を幅2として、指定した幅でtrimします。
第4引数で、trimしたかどうかが取得できます。
function trim_by_width($string, $length, $etc = '...', &$trimed = null)
{
$trimed = false;
$size = mb_strlen($string);
if ($length >= $size * 2)
{
return $string;
}
$i = 0;
for ($n = 0; $n < $size; $n++)
{
$char = mb_substr($string, $n, 1);
$width = 127 >= ord($char) ? 1 : 2;
if ($i + $width > $length)
{
$trimed = true;
return mb_substr($string, 0, $n).$etc;
}
$i += $width;
}
return $string;
}