
Posted by 가야태자
여러분들은 특정한 문자열을 자를 경우가 있을 겁니다.
문자열을 자른 다는 것은
Hello 라는 문자열이 있을때
Hel 까지만 나타내는 경우 입니다.
예를 들어 홈페이지를 제작할때 메인 페이지 공지 사항의 경우
너무 길경우 짤라서 보여 줍니다.
안녕하세요 두리하나 사이트를 오픈 했습니다.
라는 긴문장 중에서 한글 12자만 뽑는거죠...
그럴 경우에 쓰는 함수가 바로 substr 명령어 입니다.
사용 법은
substr(문자열,시작,끝)
입니다.
그러니깐 위의 경우는
substr("안녕하세요 두리하나 사이트를 오픈 했습니다.", 0, 24);
이렇게 하시면 됩니다.
한글 12자는 24 바이트 임으로 24를 써 주셔야 합니다.
그런데 저 위의 경우는 한글이 깨질 수 있습니다.
그래서 보통은 아래와 같이 함수를 제작해서 사용 합니다.
-----정의 함수 시작-----
#문자열을 자르는 함수
function is_hangul($char) {
# 특정 문자가 한글의 범위내(0xA1A1 - 0xFEFE)에 있는지 검사
$char = ord($char);
if($char >= 0xa1 && $char <= 0xfe)
return 1;
}
function is_alpha($char) {
$char = ord($char);
if($char >= 0x61 && $char <= 0x7a)
return 1;
if($char >= 0x41 && $char <= 0x5a)
return 2;
}
function cut_string($s, $l) {
if(strlen($s) <= $l && !eregi("^[a-z]+$", $s))
return $s;
for($i = $l; $i >=1; $i--) {
# 끝에서부터 한글 byte수를 센다.
if(is_hangul($s[$i-1])) $hangul++;
else break;
}
if ($hangul) {
# byte수가 홀수이면, 한글의 첫번째 바이트이다.
# 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한
# 바이트 줄임
if ($hangul%2) $l--;
$s = chop(substr($s, 0, $l));
}
else { # 문자열의 끝이 한글이 아닐 경우
for($i = 1; $i <= $l; $i++) {
# 대문자의 갯수를 기록
if(is_alpha($s[$i-1]) == 2) $alpha++;
# 마지막 한글이 나타난 위치 기록
if(is_hangul($s[$i-1])) $last_han=$i;
}
# 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함
# 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이
# 빼야할 전체 길이보다 크면 초과된 만큼 뺀다.
$capitals = intval($alpha * 0.5);
if ( ($l-$last_han) <= $capitals) $capitals=0;
$s = chop(substr($s, 0, $l - $capitals));
}
return $s;
}
-------------정의 함수 끝---------
사용하실때는 그냥 아래 함수만 사용하시면 됩니다.
하지만, 실제로는 맨마지막 글자를 뽑아서 한글인지 아닌지 계산 합니다.
그리고 한글일경우 2바이트가 되도록 처리해 줍니다. 물론 영어일 경우는 그대로 두구요.
cut_string($s, $l)
cut_string("안녕하세요 두리하나 사이트를 오픈 했습니다.", 24);
일반적으로 맨처음에 시작해서
글자 수만 제한 하는 함수를 사용했습니다.
여러분도 좋은 함수를 만드시면 저한테 좀 주세요. ^^;;
Posted by 가야태자
이곳은 가야태자의 일상생활, 사진, 리눅스, 자유, 개발언어, 데이타베이스 등에 대해서 이야기 하는 공간입니다.
- 가야태자
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 |