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 함수가 필요한 분이시라면
각자 테스트를 해보시고 사용하기 바랍니다.

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

빈배...

관련자료

등록된 댓글이 없습니다.
Today's proverb
행복해지고 싶다면, 잠시 동안만이라도 가슴에 손을 얹고 생각해 보라. 그러면 진정한 즐거움은, 발치에 돋아나는 잡초나 아침 햇살에 빛나는 꽃의 이술과 같이 우리 주변에 무수히 널려 있다는 것을 알 수 있을 것이다. 《하루 5분 생각이 인생을 결정한다 》 (이범준)