Posted by on the 14th of January, 2018 at 1:45 am.  This post has no comments.

목적

mb_substr() 은 한글이은 알파벳이든 무조건 한 글자로 세어서 자르는데, 알파벳 글자 폭이 한글보다 작아서 길이가 달라 눈에 거슬린다. 길이를 최대한 비슷하게 해 보자.

방법

mb_substr() 로 잘라낸 문자열 안에 알파벳 갯수를 센다. 알파벳 갯수만큼 잘라낸 문자열 바로 뒷부분을 더 자른다. 추가된 부분에서 알파벳이 아닌 글자 갯수를 센다. 이렇게 해서 (처음 입력한 길이 + 알파벳 갯수 – 알파벳이 아닌 글자 갯수) 를 해서 잘라낼 글자 수를 정한다.

구현

  1. mb_substr()로 잘라냄, 문자열1 이라 하면
  2. 정규표현식을 이용, 문자열1 에서 알파벳이 아닌 글자를 지움, 문자열2 라고 하면
  3. 문자열2의 문자열 길이를 구함
  4. mb_substr()로 문자열1 바로 뒤에서 부터 문자열2의 길이만큼 더 잘라냄, 문자열3 이라 하면
  5. 정규표현식을 이용, 문자열2 에서 알파벳인 글자를 지우고(문자열4) 문자열 길이를 구함
  6. 잘라야 할 길이 = 처음 입력한 길이 + 문자열2의 길이 – 문자열4의 길이
  7. mb_substr()로 위에서 구한 길이만큼 잘라냄

실제 적용한 code

--- output_tags.php.orig        2013-01-02 16:52:58.000000000 +0900
+++ output_tags.php     2013-01-02 16:53:04.000000000 +0900
@@ -967,6 +967,13 @@
                mb_internal_encoding($enc);
                if (mb_strlen($content) >= $len) {
                        $snippet = mb_substr($content, 0, $len);
+                       $onebytechar = mb_ereg_replace('[^ !"#$%&\'()*+,-\./0-9:;<=>?@\\A-Z\[\]^_`a-z{|}~]', '', $snippet);
+                       $len2 = mb_strlen($onebytechar);
+                       $snippet = mb_substr($content, $len, $len2);
+                       $onebytechar = mb_ereg_replace('[ !"#$%&\'()*+,-\./0-9:;<=>?@\\A-Z\[\]^_`a-z{|}~]', '', $snippet);
+                       $len = $len + $len2 - mb_strlen($onebytechar);
+                       $snippet = mb_substr($content, 0, $len);
+
                        if ($trim == 'word' && mb_strlen($snippet) == $len) {
                                // trim back to the last full word--NB if our snippet ends on a word
                                // boundary we still have to trim back to the non-word character

Screenshots

  1. mb_string()을 쓰기 전

    글자는 알파벳 기준 40자로 잘랐으며, 한글 한 글자는 알파벳 두 글자로 계산하였다.
  2. mb_string()을 쓴 후

    한글, 알파벳 구분 없이 40자를 세어서 자른 것을 확인할 수 있다.
  3. mb_string()에 20자를 자르기

    마찬가지로 한글, 알파벳 구분 없이 20자를 세어서 잘라 길이가 많이 다르다.
  4. 이 방법을 쓰고 난 후

    mb_string()을 이용하고 20자를 자르게 하였다. 길이가 그래도 많이 비슷해 졌다.

마무리

  • 정규표현식을 두번이나 쓰고, 문자열을 두번이나 더 자른다.
  • 어쨌든 원하는 모양을 만들었으니 만족-_-

Sorry, but commenting on this post is disabled.