-
- function substring($str, $start, $length){ //문자열 차단 기능을 사용하는 것이 좋습니다
- $ len = $length;
- if($length < 0){
- $str = strrev($str);
- $len = -$length;
- }
- $len= ( $len < strlen($str)) ? $len : strlen($str);
- $tmpstr = "";
- for ($i= $start; $i < $len; $i )
- {
- if (ord(substr($str, $i, 1)) > 0xa0)
- {
- $tmpstr .= substr($str, $i, 2);
- $ i ;
- } else {
- $tmpstr .= substr($str, $i, 1);
- }
- }
- if($length < 0) $tmpstr = strrev( $tmpstr);
- return $tmpstr;
- }
- ?>
코드 복사
사용 예:
-
-
$str1 = '저는 영어가 없는 상대적으로 긴 중국어 문자열입니다'; - $str2 = '나는 yingwen이 포함된 비교적 긴 한자 문자열입니다.';
$len = strlen($str1);
- echo '
'.$len; //28을 반환합니다
$len = strlen($str2);
- echo '
'.$len; //29를 반환합니다. /p>
echo ' '
- echo substring($str1, 0, 11)
- echo '
';
- echo substring($str2, 0, 11);
- echo '
';
- echo substring($str1, 16, 28)
- echo '
' ;
- echo substring($str2, 16, 29);
- ?>
-
-
코드 복사
결과는 다음과 같습니다.
28
29
나는 비교의 연속이다
나는 비교의 연속이다
영어가 없는 중국어
잉웬과 함께하는 중국어
이 기능은 매우 유용합니다. 예를 들어 상대적으로 긴 파일 이름을 자르는 데 사용할 수 있지만 중간에...를 추가하려면 다음과 같이 할 수 있습니다.
-
- 함수 formatName($str, $size){
- $len = strlen($str);
- if(strlen($str) > $size) {
- $part1 = substring($str, 0, $size / 2);
- $part2 = substring($str, $len - ($size/ 2), $len);
- $part1 . "..." . $part2;
- } else {
- $str;
- }
- }
- ?>
-
코드 복사
또한 인터넷에서 매우 간단한 중국어 잘림 솔루션을 테스트한 후 효과가 매우 좋습니다.
-
- echo substr($str1,0,10).chr(0);
- ?>
-
코드 복사
원리 설명:
chr(0)은 null이 아닙니다.
null은 아무 것도 의미하지 않으며 chr(0)의 값은 0입니다. 16진수로 표현하면 0x00, 2진수로 표현하면 00000000
chr(0)은 아무것도 표시하지 않지만 문자입니다.
한자가 잘리면 인코딩 규칙에 따라 항상 다른 문자를 한자로 끌어와서 해석해야 하기 때문에 왜곡된 문자가 나타나는 것입니다. 0x81~0xff 및 0x00 값의 조합은 항상 "비어 있음"으로 표시됩니다.
이 기능에 따르면 substr 결과 뒤에 chr(0)을 추가하면 문자 깨짐을 방지할 수 있습니다
20120705 업데이트:
위의 방법은 좋지만 여전히 가끔 문자가 깨져 나타나는 현상이 발생하며 그 이유는 아직 조사되지 않았습니다. 그러나 UTF8 문자 텍스트에 대해 시도 및 테스트된 다음 방법을 사용할 수 있습니다.
참고: 이 방법에서는 한자가 1단위 길이로 계산되고, 영문자 1개가 1단위 길이로 계산되므로 잘림 시 길이 설정에 주의가 필요합니다.
길이를 계산하는 방법:
-
-
- function strlen_UTF8($str)
- {
- $len = strlen( $str);
- $n = 0;
- for($i = 0; $i < $len; $i ) {
- $x = substr($str, $i, 1);
- $a = base_convert(ord($x), 10, 2);
- $a = substr('00000000'.$a, -8);
- if (substr($a, 0, 1) == 0) {
- }elseif (substr($a, 0, 3) == 110) {
- $i = 1;
- }elseif (substr($a, 0, 4) == 1110) {
- $i = 2;
- }
- $n ;
- }
- return $n;
- } // End strlen_UTF8;
///문자열 잘림 함수:
- function subString_UTF8($str, $start, $lenth)
- {
- $len = strlen($str);
- $r = 배열 ();
- $n = 0;
- $m = 0;
- for($i = 0; $i < $len; $i ) {
- $x = substr($ str , $i, 1);
- $a = base_convert(ord($x), 10, 2);
- $a = substr('00000000'.$a, -8);
- if ( $n < $start){
- if (substr($a, 0, 1) == 0) {
- }elseif (substr($a, 0, 3) == 110) {
- $i = 1;
- }elseif (substr($a, 0, 4) == 1110) {
- $i = 2;
- }
- $n ;
- }else{
- if (substr($a, 0, 1) == 0) {
- $r[ ] = substr($str, $i, 1);
- }elseif (substr($a, 0 , 3) == 110) {
- $r[ ] = substr($str, $i, 2);
- $i = 1;
- }elseif (substr($a, 0, 4) = = 1110) {
- $r[ ] = substr($str, $i, 3);
- $i = 2;
- }else{
- $r[ ] = '';
- }
- if ( $m >= $lenth){
- break;
- }
- }
- }
- return Join($r);
- } // 끝 subString_UTF8;
//사용 방법은 이전에 소개한 것과 동일합니다. 예를 들어 formatName은 다음과 같이 구현할 수 있습니다(한자 길이가 약간 최적화됨).
- 함수 형식 이름($str, $size){
- $len = strlen_UTF8($str);
- $one_len = strlen($str);
- $size = $size * 1.5 * $len / ($one_len);
- if(strlen_UTF8($str) > $size) {
- $part1 = subString_UTF8($str, 0, $size / 2);
- $part2 = subString_UTF8($ str, $len - ($size/ 2), $len);
- $part1 . "..." . $part2;
- } else {
- $str;
- }
- }
- ?>
-
코드 복사
|