PHP 에서 한글/영어 길이 맞춰서 자르기

8 Comments

PHP 에서 한글과 영어의 길이를 맞춰서 자르는 loose한 코드(UTF-8)

function utf8_strcut( $str, $size )
{
        $substr = substr( $str, 0, $size * 2 );
        $multi_size = preg_match_all( '/[\\x80-\\xff]/', $substr, $multi_chars );

        if ( $multi_size > 0 )
            $size = $size + intval( $multi_size / 3 ) - 1;

        if ( strlen( $str ) > $size )
        {
            $str = substr( $str, 0, $size );
            $str = preg_replace( '/(([\\x80-\\xff]{3})*?)([\\x80-\\xff]{0,2})$/', '$1', $str );
            $str .= '...';
        }

        return $str;
}

mb_strcut 으로 문장을 자르니 영문자등이 포함되어 있는 경우에 길이가 잘 맞지 않아서 영어랑 한글 길이에 맞춰서 자르는 함수를 여기저기서 찾아봤는데 영 길다란 코드 밖에 없길래 타이핑 하기 귀찮아서 만듬;;; 대강 급조한 코드라 속도나 정확성등에 대해서는 책임질 수 없음;;;

mb_srtcut 을 안쓰고 substr 을 쓰면 마지막 글자가 한글일 경우에 문자가 이상하게 바뀌는데 그런 경우엔 위의 정규식 매치를 변형해서 대강 걸러내면 됨…

게으름이 인생인녀석(…)

+ 글자수가 적을 때 끝선이 잘 안맞는 경향이 있어서 그 문제 해결과 함께 아예 mb_strcut 을 안써도 되도록 조금 개선해서 다시 올렸습니다. 조금 더 범용적으로 쓰일 수 있겠네요..마는..아까의 그 간략한 코드가 그립네요…-_-

8 Comments (+add yours?)

  1. 머털
    Jul 10, 2006 @ 17:26:05

    iconv_substr를 사용하는 것이 가장 깔끔한 방법 아닐까요 ^^

  2. 골빈해커
    Jul 10, 2006 @ 19:44:10

    머털 / PHP 4.x 버전을 쓰고 있거든요=ㅂ=;;

  3. 디토
    Jul 10, 2006 @ 23:19:20

    u modifier를 이용하면 UTF-8을 유니코드로 바꿔서 처리해줍니다.
    preg_replace(“/(.{$size}).+/u”, “$1…”, $str) 정도로 하면 간단하겠죠? :)

  4. 골빈해커
    Jul 11, 2006 @ 03:27:38

    디토 / 그냥 자르기만 하는거라면 그렇게 해도 됩니다만, 이 코드의 주안점은 문자열이 영어로만 되어 있을 경우나 한글로만 되어 있을 경우, 또는 영어 한글이 섞여 있을 경우라도 각 줄의 끝선을 대강이라도 맞춰주는 데 있습니다. :-)

    물론 어차피 문자열 길이가 다 같은 것도 아니고, 폰트를 가변으로 바꾸면 어쩔 수 없지않느냐..라고 하신다면 할말 없습죠 ㅡ,.ㅡ;;;

  5. 선주
    Jul 11, 2006 @ 23:34:31

    까만것은 글이고 하얀것은 바탕이군요.

    꼭 탈족한 시험지를 받아보는 기분입니다. :)

  6. ihwan
    Nov 28, 2009 @ 02:23:23

    저도 비슷한 문제가 있었는데 골빈해커님 방법을 사용하면 조금이나마 간격이 줄여지는군요.

    근데 글씨 폰트가 맑은 고딕에 큰 사이즈경우에는 비슷하네요 -ㅅ- 흠…

    좀 더 연구를 해봐야겠습니다. 이것참 -ㅅ-;

  7. php개발자
    Nov 22, 2011 @ 18:10:37

    감사합니다. 소중한 코드 잘 응용해 사용하겠습니다.

  8. 초보
    Dec 21, 2011 @ 10:38:31

    ㅠㅠ 여러군데에서 다양한 소스를 가져다 해봤지만 자꾸 끝에 이상한 기호가 붙어서 헤메던 중 올려주신 코드를 써보니 아주 깔끔하게 잘나오네요~ 감사합니다!! 저도 공부좀 더 열심히 해야겠어요~ 요런것도 만들어 쓸수 있게…ㅎㅎㅎ

Leave a Reply