一般的な Web サイトのページを表示するには、必然的に部分文字列のインターセプトが必要になりますが、これは英語のユーザーにのみ適しています。また、中国語と英語が混在するユーザーの場合は、truncate を使用すると文字化けが発生します。同じ数の文字列をインターセプトした場合、実際の表示長は異なりますが、視覚的には不均一に見え、画像は美しくなります。これは、漢字 1 文字の長さが英語 2 文字の長さにほぼ等しいためです。さらに、truncate は、GB2312、UTF-8、および他のエンコーディングと同時に互換性がありません。
改善された SmartTruncate: ファイル名: modifier.smartTruncate.php
コードをコピー コードは次のとおりです:
< ;? php
関数 SmartDetectUTF8($string)
{
static $result = array();
if(! array_key_exists($key = md5($string))
{
$utf8 = "
/^(?:
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # 過長でない 2 バイト
| xE0[xA0-xBF][x80-xBF] # オーバーロングを除く
| [xE1-xECxEExEF][x80-xBF]{2} # ストレート 3 バイト
| -xBF ] # サロゲートを除く xF0[x90-xBF][x80-xBF]{2} # プレーン 1-3
| [xF1-xF3][x80-xBF]{3} # プレーン 4- 15
|
}
return $result[$key];
関数 SmartStrlen($string)
{
$result = 0; 🎜>$number = SmartDetectUTF8($string) ? 3 : 2;
for($i = 0; $i < strlen($string); $i = $bytes)
{
$bytes = ord(substr( $string, $i, 1)) > $number : 1;
$bytes > 1.0 : 0.5;
}
関数 SmartSubstr($string, $start, $length = null)
{
$result = '';
$number = SmartDetectUTF8($string) ?
if( $start < 0)
{
$start = max(smartStrlen($string) $start, 0);
}
for($i = 0; $i
if($start <= 0)
{
break
}
$bytes = ord (substr($string , $i, 1)) > 127 ? $start -= $bytes > 1.0 : 0.5; length))
{
$result = substr($string, $i);
}
else
{
for($j = $i; $j < strlen ($string); $j = $bytes)
{
if($length <= 0)
{
break;
}
if(($bytes = ord) (substr($string , $j, 1)) > 127 ? $number : 1) > 1)
{
if($length < 1.0)
{
break; 🎜>}
$result .= substr($string, $j, $bytes);
$length -= 1.0;
}
else
{
$result .= substr($string, $j, 1);
$length -= 0.5;
}
}
return $result;
}
関数 Smarty_modifier_smartTruncate($文字列、$length = 80、$etc = '...'、
$break_words = false、$middle = false)
{
if ($length == 0)
return '' ;
if (smartStrlen($string) > $length) {
$length -= SmartStrlen($etc);
if (!$break_words && !$middle); preg_replace('/s ?(S )?$/', '',smartSubstr($string, 0, $length 1));
}
if(!$middle) {
return SmartSubstr( $string, 0, $length).$etc;
} else {
returnsmartSubstr($string, $length/2) .smartSubstr($string, -$length/2);
}
} else {
return $string;
}
}
?>
上記のコードは、truncate の元の機能を完全に実現します。 GB2312とUTF-8の両方のエンコーディングに対応しており、文字長を判定する際に、中国語文字は1.0、英語文字は0.5としてカウントされるため、部分文字列をインターセプトする際にムラが生じません。プラグイン 特別なことは何もありません。ここでは簡単なテストを示します:
{$content|smartTruncate:5:".."} ($content は "A China B China C People D People E Common F and G 国 H")
表示: A 中国語 B 中国語 C.. (中国語の記号の長さは 1.0 としてカウントされ、英語の記号の長さは 0.5 としてカウントされ、省略された記号の長さが考慮されます)
GB2312 エンコードを使用しているか、またはUTF-8 エンコーディングでは、結果が同じであることがわかります。これは、プラグイン名に「smart」という単語を追加した理由の 1 つです。