본문 바로가기

Programming/php

[php] 받아온 값 줄여서 보여주기(?) substr 한글깨짐 해결하기



이걸 어떻게 표현해야 할지몰라서 검색도 못하고 끙끙댔던 나란 여자.. 못난 여자...


결국 검색으로 못찾고 과장님 파일에서 찾았다.ㅋㅋㅋㅋㅋㅋ


쇼핑몰이나 게시판 등등에서 가끔 제목이 길거나 내용을 미리보여 줄 때,

긴 내용(혹은 제목)이라면 특정 byte 이상은 자르고 그뒤에 ".."을 붙여주는 것!


도대체 이걸 한 단어로 뭐라고 표현해야하지.ㅜㅜ??


암튼 그걸 할려고 하는데 한글은 2byte 문자이다 보니 지정해놓은 byte가 예를들어 200byte라면,

문자하나가 잘려서 2byte짜리 문자가 절반만 불러와져서 한글이 깨져 보인다.


검색해보니 mb_substr()을 사용하면 된다는데,

php 버전이 안맞아서 사용이 불가능했다.ㅜㅜ


간단하게 생각해서 그냥 아예 공백들을 싹다 제거해서 들고오면 절반만 들고 올일은 없지 않을까?

했는데 그건 또 아니라고..ㅜㅜ


기본적인 건 substr() 함수를 사용해서 문자열을 잘라주면 되는데 왜때문에 내생각처럼 잘되질 않니ㅜㅜ???


하고있다가 과장님이 파일을 보여주셨당.


function CutString($str, $len, $checkmb=false, $tail='...') {


preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $str, $match);


$m = $match[0];

$slen = strlen($str);

$tlen = strlen($tail);

$mlen = count($m);


if ($slen <= $len) return $str;

if (!$checkmb && $mlen <= $len) return $str;


$ret = array();

$count = 0;


for ($i=0; $i < $len; $i++) {


$count += ($checkmb && strlen($m[$i]) > 1)?2:1;


if ($count + $tlen > $len) break;


$ret[] = $m[$i];


}

return join('', $ret).$tail;

}


짜란~ 이함수가 있다면 한글이 깨지지 않고도 글자를 원하는 만큼만 보여주고 "..." 으로 처리가 가능하다.


일단 CutString 함수는 클래스 안에 선언된 함수이다.

클래스안에 필요한 모든 함수를 다 선언하고 만들어놓은 뒤,

php 페이지에서 include 해서 함수를 필요할 때마다 불러오는 방식인데

substr이 필요한 곳에 함수를 로드!


$변수=$생성자->CutString(substr할값, byte, substr의 길이, 자른후 붙여줄 문자열);


이런식으로 불러온다.


예를 들면, 「$context=$Func->CutString($Review[16], "240", strlen($Review[16]), "...");」과 같은 형식...