utf-8 한글을 자르기 위한 함수입니다. JavaScript 처럼 멀티바이트 글자에 대해 1문자로 취급할 수도 있도록 했습니다. 원래대로라면 utf-8 으로 된 한글은 3byte 이지만, 익숙한 계산법을 따르기 위해서 이 함수에서는 2byte인 것처럼 취급합니다. 즉, 다음과 같습니다.
원본
한글과 English를 혼용해서 씁니다.
- checkmb=true, len=10
한글과 Eng (한글=23 + 공백=11 + 영문=1*1 => 10) - checkmb=false, len=10
한글과 Englis (모두 합쳐 10자)
$a = '한글hangul도 포함include되었습니다.';
/**
* cut string in utf-8
* @author Taegon Kim (https://taegon.kim)
* @param string $str source string
* @param int $len cut length
* @param int $checkmb if this argument is true, the function treats multibyte character as two bytes. Default: false.
* @param string $tail abbreviation symbol
* @return string processed string
*/
function strcut_utf8($str, $len, $checkmb=false, $tail='...') {
preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $str, $match);
$m = $match[0];
$slen = strlen($str); // length of source string
$tlen = strlen($tail); // length of tail string
$mlen = count($m); // length of matched characters
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;
}
파라미터 설명
String $str
: 원본 문자열
Integer $len
: 문자열을 자를 길이
Boolean $checkmb
: 이 값을 true로 하면 한글을 영문2자와 같이 취급한다. 기본값은 false
String $tail
: 생략후 붙일 줄임 기호
반환값
{String}
처리된 문자열
주의! 이 함수는 UTF-8 문자열을 다룹니다. 다른 charset 에는 적용되지 않습니다.
mb_ 계열 함수가 없는 환경을 위해서 만들어봤습니다.
거의 없을 줄 알았는데 아직도 그런 환경이 있기는 있더라구요. ^^;;
[adsense]
고니양~ 코드 잘렸어요~. 후다닥~
그렇더라구요. ㅎㅎ 깜빡하고 있었어요. ^^;;
조건에 엠퍼센트(&) 빠졌...
수정했...
많은 도움이 되였습니다.
ㅎㅎ 참고합니다 ^^
와우~ 고니님 완전 멋집니다. 구글링 하다가 여기까지 들어왔습니다.
완전 사랑합니다~!!!~~~~~ @@@
찾아주셔서 감사합니다.
덕분에 오류난 채 방치됐던 포스트를 수정할 수 있었습니다. ^-^
곤란하던 차에 많은 도움 되었습니다.
좋은것 같네요 근데
~~ 이런 특수 기호? 에 대해서는 길이를 못얻어 오는것 같습니다..
if ($slen < = $len) return $str; 여기에서 에러가 발생합니다. Parse error: syntax error, unexpected '=' 이유가 뭘까요?
<와 = 사이에 공백이 없어야 하는데 본문에는 있네요. ^^; <= 로 바꿔주세요.