php에서 한글 자르기 


 

utf-8 한글을 자르기 위한 함수입니다.

원본

몇일전 제로보드를 utf-8 환경으로 컨버팅 한적이 있는데.

그후에 몇가지 오류가 발견되었다.

이건 그중에 하나로 최근게시물 같은데서 문자열을 자를때 잘린 문자가 깨져서 나오는 경우이다.

php 의 strlen 으로 한글 한글자의 길이를 확인해본결과 3 이었다.

기존에 zb4 가 개발되던 euc-kr 환경은 2였기때문에 cut_str 함수를 수정해 줄필요가 있다.

수정은 아래와같이 했다.

lib.php 파일의 cut_str 함수를 아래와같이 수정한다.


function kstring_cut($msg,$cut_size) 

{

  if($cut_size<=0) return $msg;

  if(ereg("\[re\]",$msg)) $cut_size=$cut_size+4;

    $max_size = $cut_size;

  $i=0;

  while(1) 

{

   if (ord($msg[$i])>127)

    $i+=3;

   else

    $i++;


   if (strlen($msg) < $i)

    return $msg;



   if ($max_size == 0)

    return substr($msg,0,$i)."...";

   else

    $max_size--;

}

  }




 




 

$label = kstring_cut ($문자열변수,가져올 문자열 길이)
echo $label;
    
function kstring_cut ($lbl, $length) { 
       preg_match('/([\x00-\x7e]|..)*/', substr($lbl,0,$length), $return);  //먼저 자르고 한글 아닌 것은 두글자씩 나머지는 영문기준 한 글자씩 처리한다.
 
      if ( $length < strlen($lbl) ) $return[0].="...";    //문자열이 길면 " ... " 을 붙인다.
      return $return[0];
}


// 마퀴태크 <marquee> 사이에서 최근 공지 게시글을 뽑아오는 문제를 해결하는 과정에서 사용하였다.

한글과 같이 2바이트 문자열을 쓰는 경우 물음표(?)가 출력되어 버리는데, 맨 끝의 문자열이 2바이트중 절반인 1바이트만 가져오게 되어 발생하는 문제점이다.  2바이트가 되어야 문자조립이 되는데 반만 가져왔으니 글자 조립이 될 수 없기 때문이다.

따라서 2바이트 문자열을 사용하는 사이트에서 지정한 갯수만큼 문자열을 가져올 때는 위의 구문을 사용하면 된다.

영문자만 사용할 경우 단순하게 substr($문자열변수, 시작위치, 가져올글자수); 하면 된다. 그러나 이런 경우도 특수문자를 쓰는 경우라면 위 구문을 사용하거나 다른 형태의 사용자 함수를 만들어 써야 할 것이다.

 



1.

 

<?

function LongCut($s, $l)
{
    if( strlen($s) <= ($l+3))
        return $s;

    if( ord($s[$l-1]) > 127 ) {      //ord ->  ascii 체크. 127 초과면 한글
      $nc = 2;
      while( ord($s[$l-$nc]) > 127 ) $nc++;
      $l -= !($nc & 1);
    }
    return substr($s, 0, $l) . "...";
}
?>

 

 

2.

<?

function han_cut($val,$cut_len){  //$val 자를 문자열, $cut_len 원하는 문자열길이

$tot_len = strlen($val);
$cut_str = substr($val,0,$cut_len);
$len = strlen($cut_str);

for($x=0;$x < $len;$x++){
if(ord($val[$x]) > 127) { $hanlen++; }
else{ $englen++; }
}

$cut_gap = $hanlen % 2;

if($cut_gap == 1){ $hanlen--; }

$length=$hanlen + $englen;

if($tot_len > $length){ return substr($val,0,$length)."..."; }
else{ return substr($val,0,$length); }
}

?>





태초에 나는 개그이야기를 만들었다.
내말을 믿고 나를 따르면 천당,
내말을 믿지않고 나를 따르지 않으면 지옥,
나는 하늘나라(우주)에 사느니라.

그럼 난 외계인?