일반 웹사이트 페이지 표시에는 필연적으로 하위 문자열이 포함됩니다. 이때 truncate는 유용하지만 영어 사용자에게만 적합합니다. 중국어 사용자의 경우 truncate를 사용하면 문자가 깨질 수 있으며 중국어와 영어가 혼합된 경우 문자열의 경우 동일한 수의 문자열을 가로채면 실제 표시 길이가 달라져 시각적으로 고르지 않게 나타나고 이미지가 아름다워집니다. 한자의 길이가 대략 영어 두 글자의 길이와 같기 때문이다. 또한 truncate는 GB2312, UTF-8 및 기타 인코딩과 동시에 호환되지 않습니다.
smartTruncate 개선: 파일 이름: modifier.smartTruncate.php
코드 복사 코드는 다음과 같습니다.
< ;? php
function smartDetectUTF8($string)
{
static $result = array()
if(!array_key_exists($key = md5($string), $result))
{
$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
| $string)
}
return $result[$key];
}
function smartStrlen($string)
{
$result = 0; 🎜>$number = smartDetectUTF8($string) ? 3 : 2
for($i = 0; $i < strlen($string); $i = $bytes)
{
$bytes = ord(substr( $string, $i, 1)) > 127 ? $number : 1;
$result = $bytes > 1.0 : 0.5;
}
function smartSubstr($string, $start, $length = null)
{
$result = '';
$number = smartDetectUTF8($string) ?
if( $start < 0)
{
$start = max(smartStrlen($string) $start, 0)
}
for($i = 0; $i < strlen($ string); $i = $bytes)
{
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 ($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;
}
function 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) {
$string = preg_replace('/s ?(S )?$/', '', smartSubstr($string, 0, $length 1))
}
if(!$middle) {
return smartSubstr( $string, 0, $length).$etc;
} else {
return smartSubstr($string, 0, $length/2) $etc .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 공산주의 F 및 G 국가 H")
표시: A 중국어 B 중국어 C.. (한자 기호 길이는 1.0으로 계산, 영어 기호 길이는 0.5로 계산, 생략된 기호의 길이는 고려)
GB2312 인코딩 사용 여부 또는 UTF-8 인코딩을 사용하면 결과가 동일하다는 것을 알 수 있습니다. 맞습니다. 이것이 플러그인 이름에 smart라는 단어를 추가한 이유 중 하나입니다.
위 내용은 GB2312의 내용을 포함하여 GB2312 php smarty?gb2312/utf-8에서 가로채는 중국어 문자 문제를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.