한글자르기 함수
3가지 함수를 통해 한글 자르기를 해보겠습니다.
함수1
function shortenStr($str, $maxlen) {
if ( strlen($str) <= $maxlen ) // $str변수 바이트값이 $maxlen 크기보다 작거나 같으면
return $str; // $str값을 리턴해준다
// 여기부터 이해가 잘 안가네요
$effective_max = $maxlen - 3; // 최대 바이트 20이니 20-3=17 요값이 들어가는게 맞죠???
// 3은 소스 마지막에 "..." 이 문자열 뒤에 붙기 때문입니다.
$remained_byte = $effective_max; // 이값을 다시 effective_max 값을 다시 remained_byte로 넘기면
// remained_byte 값은 17이 되는거 맞죠???
$retStr=""; //$retStr 값은 아무것도 없는 공백
$hanStart=0; //$hanStart =0 왜 이값을 0으로 하는지 도대체 모르겄네용??
/*
위 두줄은 단지 변수를 초기화 시키고 있는 겁니다.
그런데 아래내용을 보면 $hasStart=false; 가 되어야 할 듯 싶어요...ㅡㅡ;
/*
for ( $i=0; $i < $effective_max; $i++ ) {
$char=substr($str,$i,1); // 문자열 첫글자 한글자씩 $char 변수에 넣음
if ( ord($char) <= 127 ) { //영문일 경우
$retStr .= $char; //$char 변수 값을 $reStr 변수에 넣음
$remained_byte--; //$remained_byte--; -1값을 줌 왜 감소값을 주는건지 모르겠어용?
/*
$remained_byte 가 잘라야 할 바이트를 의미하기 때문입니다.
영문자이기에 1바이트 줄었다는 의미죠.
*/
continue;
}
/*
여기부터는 위에서 영문을 확인했기 때문에 무조건 2바이트로 처리하는군요. (가장 어이없는 부분)
$hanStart 변수가 한글을 시작했는지를 의미하기에
!$hanStart 은 초기값이 0 이기에 true 가되고
$remained_byte 도 남은 문자열이 1보다 크다면 true 겠네요.
*/
if ( !$hanStart && $remained_byte > 1 ) { //이부부은 도대체 hanstart 값이 0 이고 remained_byte
$hanStart = true; // 한글이 시작되었다는 의미에서 true 로 설정하고 있습니다.
$retStr .= $char; // 현재 $char 를 $retStr 에 붙이고
$remained_byte--; // 역시 확인해야 할 남은 문자열에서 -- 를 해줍니다.
continue; // 그리고 루프를 돌죠.
}
/*
위 continue 를 통해 루프가 새로돌면서
2바이트인 한글에서 두번째 바이트가 아래 조건에 충족하게됩니다.
바로 위에 조건에서 $hasStart 가 false 일때 처리하면서 $hasStart 를 true로 저장했기 때문이죠.
*/
if ( $hanStart ) { // 한글 문자열 처리가 시작되었는지를 확인함
$hanStart = false; // 여기서 한글 처리가 끝남을 저장합니다.
$retStr .= $char; // 여기 부터는 위와 같은 내용이죠
$remained_byte--;
}
}
return $retStr .= "...";
// 문자열 마지막에 ... 을 붙여 잘렸다는 것을 알립니다. 이것 때문에 위에서 -3 을 해준 것이고요.
}
함수2
우선 위에 있는 소스를 간단히 처리해 보겠습니다.
오래전에 쓰던 방식이라 저도 좀 헷갈리네요.
function textCut($str, $limit, $suffix = '...') {
$len = strlen($str); // 문자열 길이를 $len 에 저장
if(!empty($limit) && $limit < $len ) { // $limit 이 비어있지 않으며 $len 보다 작을 경우,
$str = substr($str,0,$limit); // $str 을 $limit 길이로 잘라서 다시 $str 에 저장
for($i=0,$han=0;$i<$limit; $i++) { // $limit 길이만큼 반복
if(ord($str[$i]) > 127) $han++; // 만약 2바이트 문자일 경우 $han++ 한다
}
if($han%2 == 1) $limit--; // $han 을 2로 나눴을 때 나머지가 1이 나온다면
// 현재 문자열 마지막이 깨진것으로 간주하고 $limit 에 -- 한다.
// 2바이트 문자이기 때문에 2로 나눴을 때 나머지가 나오면 안됩니다.
$str = substr($str,0,$limit).$suffix; // 새로운 $limit 을 반영하여 문자열을 자르고 $suffix 를 붙인다.
}
return $str;
}
함수3
이제 마지막으로, 요즘은 UTF-8 의 유니코드를 많이 사용하기 때문에 4바이트 문자도 무시할 수 없습니다.
그런데 다행이도 PHP에 지원하는 모듈이 있습니다. mbstring 이란 것인데,
PHP 소스 컴파일을 하신다면 --enable-mbstring 을 옵션으로 넣어주셔야 합니다.
현재 사용 가능한지 여부는 phpinfo() 를 통해 출력된 화면에서 mbstring 으로 검색을 해보세요.
사용 가능하시다면 아래 소스를 사용하실 수 있습니다.
$str = "안녕하세요. 반갑습니다.";
echo mb_strimwidth($str, 0, 10, "...", "UTF-8");
* 0 은 시작 포인트로써 문자열 맨 처음 부터 확인하라는 뜻입니다.
* 10 이 자를 문자열의 Byte 를 의미하며
* "..." 이 자른 후 뒤에 붙을 문자열
* "UTF-8" 은 현재 입력된 문자열의 인코딩 입니다.
참고로 10 은 문자열 뒤에 붙을 ... 까지 포함한 길이를 지정하시면 됩니다.
위 예제의 결과는 아래와 같습니다.
PHP메뉴얼은 아래 링크를 참고하세요.