mb_substr() Function Customize
Posted by 마냥 on the 14th of January, 2018 at 1:45 am. This post has no comments.목적
mb_substr() 은 한글이은 알파벳이든 무조건 한 글자로 세어서 자르는데, 알파벳 글자 폭이 한글보다 작아서 길이가 달라 눈에 거슬린다. 길이를 최대한 비슷하게 해 보자.
방법
mb_substr() 로 잘라낸 문자열 안에 알파벳 갯수를 센다. 알파벳 갯수만큼 잘라낸 문자열 바로 뒷부분을 더 자른다. 추가된 부분에서 알파벳이 아닌 글자 갯수를 센다. 이렇게 해서 (처음 입력한 길이 + 알파벳 갯수 – 알파벳이 아닌 글자 갯수) 를 해서 잘라낼 글자 수를 정한다.
구현
- mb_substr()로 잘라냄, 문자열1 이라 하면
- 정규표현식을 이용, 문자열1 에서 알파벳이 아닌 글자를 지움, 문자열2 라고 하면
- 문자열2의 문자열 길이를 구함
- mb_substr()로 문자열1 바로 뒤에서 부터 문자열2의 길이만큼 더 잘라냄, 문자열3 이라 하면
- 정규표현식을 이용, 문자열2 에서 알파벳인 글자를 지우고(문자열4) 문자열 길이를 구함
- 잘라야 할 길이 = 처음 입력한 길이 + 문자열2의 길이 – 문자열4의 길이
- 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
- mb_string()을 쓰기 전
글자는 알파벳 기준 40자로 잘랐으며, 한글 한 글자는 알파벳 두 글자로 계산하였다. - mb_string()을 쓴 후
한글, 알파벳 구분 없이 40자를 세어서 자른 것을 확인할 수 있다. - mb_string()에 20자를 자르기
마찬가지로 한글, 알파벳 구분 없이 20자를 세어서 잘라 길이가 많이 다르다. - 이 방법을 쓰고 난 후
mb_string()을 이용하고 20자를 자르게 하였다. 길이가 그래도 많이 비슷해 졌다.
마무리
- 정규표현식을 두번이나 쓰고, 문자열을 두번이나 더 자른다.
- 어쨌든 원하는 모양을 만들었으니 만족-_-
Submit Comment
Sorry, but commenting on this post is disabled.