아

문자열 자르기 질문드립니다.

· 2011-10-10 (월) 21:37:19 · 2627 · 2
안녕하세요
이리저리 찾아보고 고민도 해보고 고심도 해보고 생각도 해보고 해봤지만,
생각처럼 안되어 고수님들의 도움좀 얻고자 글을 남김니다 불쌍한 초보 도와주신다 생각해주세요 ^^

아래 소스는 보시면 알겠지만 긴 문자열을 잘라서 배열로 만드는 소스입니다.

function splitString($str,$size) {
$len = strlen($str);

if($size >= $len) return array($str);
$rtn = array();
$flag = 0;
$start = 0;
$end = $size-1;
for($i=0;$i<$len;$i++) {
if(ord($m[$i]) > 127) $flag++;
if($end == $i) {
if($flag%2 == 1) {
array_push($rtn,substr($str,$start,$size-1));
$start += $size - 1;
}
else {
array_push($rtn,substr($str,$start,$size));
$start += $size;
}
$end = $start + $size - 1;
}
}
if($len>=$start) {
array_push($rtn,substr($str,$start,$len-$start));
}
return $rtn;
}


이 소스를 적용하여 만들었는데 각 잘리는 부분마다 한글이 깨지는 부분이 발생하더라구요.
UTF-8 환경이라 그런가 해서 소스 검색을 해보았습니다.
그랬더니 UTF-8 환경에서 한글 문자열 자르기가 있더라구요.
하.지.만. 제목 추출하듯 앞에서 부터 몇글자만 추출하는 소스 밖에는..

제가 찾은 UTF-8 한글 자르기 소스입니다.

function strcut_utf8($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;
}

이 두개를 잘 조합시켜 UTF-8 환경에서도 한글이 안짤리고 배열로 저장되게 만들려고 일주일간 고민해봤는데
제 허접한 실력으로는 무리가 있더라구요..
어떻게 보면 "밥을 떠서 먹여주세요" 일수도 있지만 정말 안되어 글을 남김니다.
도움좀 부탁드립니다.
감사합니다.
즐거운 하루 보내세요~<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]</div>
|

댓글 2개

2011-10-11 (화) 14:42:15
mbstring 에 관해서 찾아보심이 어떠실까요.
2011-10-12 (수) 16:15:12
곰곰히 생각해 보았습니다..
UTF-8 하고 euc-kr 하고 뭐가 다른지...
euc-kr 은 한글을 2byte로 인식하고, utf-8은 3byte로 인식을 합니다.
그래서 소스중간부분을 수정했습니다.

function splitString($str,$size) {
$len = strlen($str);

if($size >= $len) return array($str);
$rtn = array();
$flag = 0;
$start = 0;
$end = $size-1;
for($i=0;$i<$len;$i++) {
if(ord($m[$i]) > 127) $flag++;
if($end == $i) {
if($flag%3 == 1) {
array_push($rtn,substr($str,$start,$size-1));
$start += $size - 1;
} else if($flag%3 == 2) {
array_push($rtn,substr($str,$start,$size-2));
$start += $size - 2;
} else {
array_push($rtn,substr($str,$start,$size));
$start += $size;
}
$end = $start + $size - 1;
}
}
if($len>=$start) {
array_push($rtn,substr($str,$start,$len-$start));
}
return $rtn;
}

일단은 잘 되는거 같습니다.
보시고 의견 있으신분 의견 부탁드립니다.
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
11-10-18 조회 2,540
11-10-18 조회 2,453
11-10-18 조회 2,353
11-10-17 조회 3,718
11-10-17 조회 5,014
11-10-17 조회 2,377
11-10-17 조회 2,640
11-10-17 조회 3,744
11-10-16 조회 2,425
11-10-16 조회 3,066
11-10-16 조회 3,503
11-10-15 조회 1.2만
11-10-15 조회 3,171
11-10-15 조회 2,897
11-10-15 조회 3,575
11-10-15 조회 3,555
11-10-15 조회 2,800
11-10-14 조회 2,835
11-10-13 조회 2,616
11-10-13 조회 4,391
11-10-12 조회 2,428
11-10-12 조회 2,587
11-10-12 조회 3,704
11-10-12 조회 3,996
11-10-12 조회 2,343
11-10-11 조회 2,861
11-10-11 조회 2,510
11-10-11 조회 2,680
11-10-11 조회 2,964
11-10-10 조회 2,628
11-10-10 조회 2,582
11-10-10 조회 2,301
11-10-10 조회 2,310
11-10-10 조회 2,599
11-10-10 조회 2,705
11-10-09 조회 2,516
11-10-08 조회 2,495
11-10-08 조회 4,440
11-10-08 조회 2,797
11-10-07 조회 3,022
11-10-07 조회 2,869
11-10-07 조회 3,375
11-10-06 조회 3,969
11-10-06 조회 2,520
11-10-06 조회 2,614
11-10-06 조회 3,809
11-10-06 조회 2,650
11-10-06 조회 4,181
11-10-06 조회 2,421
11-10-05 조회 2,670
11-10-05 조회 2,843
11-10-05 조회 3,919
11-10-04 조회 2,806
11-10-04 조회 5,248
11-10-04 조회 2,732
11-10-04 조회 2,287
11-10-03 조회 2,648
11-10-02 조회 2,549
11-10-02 조회 3,273
11-10-01 조회 2,287
11-10-01 조회 2,599
11-09-30 조회 2,491
11-09-30 조회 2,579
11-09-30 조회 2,779
11-09-30 조회 2,778
11-09-30 조회 3,548
11-09-30 조회 2,568
11-09-30 조회 2,991
11-09-29 조회 4,827
11-09-29 조회 2,654
11-09-29 조회 2,562
11-09-29 조회 2,970
11-09-28 조회 3,073
11-09-28 조회 3,842
11-09-28 조회 3,048
11-09-28 조회 2,428
11-09-28 조회 2,370
11-09-28 조회 2,239
11-09-28 조회 2,501
11-09-28 조회 4,011
11-09-26 조회 2,428
11-09-26 조회 2,490
11-09-26 조회 2,609
11-09-25 조회 2,949
11-09-24 조회 2,448
11-09-23 조회 2,695
11-09-23 조회 3,292
11-09-23 조회 2,423
11-09-23 조회 2,842
11-09-23 조회 2,190
11-09-22 조회 2,354
11-09-22 조회 2,770
11-09-21 조회 3,140
11-09-21 조회 3,173
11-09-20 조회 2,749
11-09-20 조회 2,569
11-09-20 조회 3,106
11-09-19 조회 2,621
11-09-19 조회 5,902
11-09-19 조회 3,686