PHP & Others

부분 문자열 자르기 개선(한글 및 2바이트 문자열)

컨텐츠 정보

본문

부분 문자열 자르기 (한글 및 2바이트 문자열) ]

//----------------------------------------------------------------
// substr for multibyte string
// substr for multibyte string
function substr_mb($str, $start, $len='', $tail='')
{
    if($len===0) return;
    $totalLen=strlen($str);
    $epos=($len>0)?(int)($start+$len):(int)($totalLen+$len);

    $s=$start-9;
    if($s<9) $s=0;
    while($s<$start) {
        if(ord($str[$s])>127) $s++;
        $s++;
    }

    $e=($epos-9);
    if($e<9) $e=0;
    $str2=substr($str,$s,$epos);
    while($e<$epos) {
        if(ord($str2[$e])>127) $e++;
        $e++;
    }

    $str=substr($str,$s,$e);
    if($totalLen>$epos) $str.=$tail;
    return $str;

} // END FUNC


//-------------------
//  사용 방법
//-------------------

사용법은 substr 함수와 같습니다.


//-------------------
//  사용 예
//-------------------

$contents="우리는 민a족 a중흥의 역사적a 사aa명c을 띄32고a
이 ed땅에 태어났다.★♣End";


echo substr_mb($contents, 0, strlen($contents)-10, "===");


for($i=1;$i<=strlen($contents);$i++)
    echo ''. $i . ":" . substr_mb($contents, 0, $i, "...");


for($i=strlen($contents);$i>=0;$i--)
    echo ''. $i . ":" . substr_mb($contents, 0, $i, "...");


//----------------------------------------------------------------


작년 초무렵  이곳에 올렸던 한글 문자열 자르기 관련 함수를
오랜만에 업그레이드(?) 해 봅니다.

멀티 바이트 문자를 가진 문자열로부터 부분 문자열을 추출했을때
mb_substr 함수는 부분 문자열을 추출하는데 있어 비교적 정확하지 않았습니다.


제 컴에서 테스트해 본 결과

▶ 실행속도는 mb_substr 함수와 비슷합니다.
(많은 테스트를 해보지 않아 정확하지는 않지만 큰 차이는 없습니다.)

▶ 멀티 바이트 문자를 가진 문자열로부터 부분문자열을 추출시
mb_substr 보다 비교적 정확하게 추출합니다.



말씀 드렸듯이 많은 테스트를 해보지 않았기에 위의 substr_mb 함수가 필요한 분이시라면
각자 테스트를 해보시고 사용하기 바랍니다.

문제가 없다면, 누군가 더 최적화 시키거나 개선하여 함께 나눌 수 있길 바랍니다. ^^

빈배...

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
“무릇 물이란 지세를 따라 흐르되 작은 틈도 놓치지 않고 적시니 지혜를 갖춘 자와 같고, 움직이면서 아래로 흘러가니 예를 갖춘 자와 같으며, 어떤 깊은 곳도 머뭇거리지 않고 들어가니 용기를 가진 자와 같고 장애물이 막혀서 갇히면 고요히 맑아지니 천명을 아는 자와 같으며, 험한 곳을 거쳐 멀리 흐르지만 끝내 남을 허물어뜨리는 법이 없으니 덕을 가진 자와 같다. 천지는 이것으로 이루어지고, 만물은 이것으로 살아가며, 나라는 이것으로 안녕을 얻고, 만사는 이것으로 평안해지며, 만물은 이것으로 바르게 되는 것이다. 이것이 지혜로운 자가 물을 좋아하는 이유이다.” (한영, <<한시외전>>)