PHP에서 문자열을 자르기 위해서는 주로 substr 함수를 이용합니다. substr 함수는 문자열을 잘라서 그 잘린 문자열을 되돌려 주는 기능을 가지고 있는데, 자르는 기준이 바이트 단위입니다. 바이트 단위이다 보니까 한글과 같은 2바이트 문자가 포함된 경우 문자열이 온전히 끝나기 전에 잘려지는 경우 뒷 부분이 깨져서 보이게 됩니다.
아래는 substr 함수로 한글문자열을 잘라내는 간단한 예제이고 그 아래는 실행결과 입니다.
< ?php
$title = "겨울비 내려와 머리를 적시네";
$test = substr($title,0);
for($i=1; $i < strlen($title); $i++ ){
$test = substr($title,0,$i);
echo $i.":".$test."\n<br>";
}
?>
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:겨울비 내려와 머리를 적시?
한글 문자열을 substr 함수로 잘랐더니 자르기 위한 바이트에 따라서 뒷 부분이 깨지고 있는게 보이실 겁니다. 아래 cutStr 함수는 한글 문자열을 깨끗하게 잘라내기 위해서 작성해 본 함수 입니다.
로직중 눈여겨 보실 부분은 ord 함수로 문자의 아스키 코드값을 체크해서 아스키 코드값이 127보다 클경우 (128부터 한글) 포함된 한글 바이트 수를 더한다는 것입니다. 그리고 마지막에 한글 바이트 수가 짝수로 딱 맞아 떨어질 때는 자르고자 하는 바이트 수 그대로 되돌리고 그렇지 않을 경우 자를 바이트 수에 1을 더한다는 것입니다.
그 이유는 한번 생각해 보시기 바랍니다. 크게 어렵지 않습니다.
< ?php
//한글을 깨끗하게 자르기 위한 함수
function cutStr($str,$cutbyte)
{
$strbyte = strlen($str); //$str 의 바이트 수를 구한다
if($strbyte <= $cutbyte) return $str;
for($i=0; $i<$cutbyte;$i++){
if(ord($str[$i])>127) $hancnt++; //아스키 코드값 128부터 $hancnt를 1씩 증가시킨다
}
if($hancnt%2==0) $str = substr($str,0,$cutbyte);
else $str = substr($str,0,$cutbyte+1);
return $str;
}
?>
아래는 cutStr 함수를 사용해서 한글을 잘라내는 예제와 실행화면입니다.
< ?php
$title = "겨울비 내려와 머리를 적시네";
for($i=1; $i < strlen($title); $i++ ){
$test = cutStr($title,$i); //cutStr 함수 호출
echo $i.":".$test."\n<br>";
}
//한글을 깨끗하게 자르기 위한 함수
function cutStr($str,$cutbyte)
{
$strbyte = strlen($str); //$str 의 바이트 수를 구한다
if($strbyte <= $cutbyte) return $str;
for($i=0; $i<$cutbyte;$i++){
if(ord($str[$i])>127) $hancnt++; //아스키 코드값 128부터 $hancnt를 1씩 증가시킨다
}
if($hancnt%2==0) $str = substr($str,0,$cutbyte);
else $str = substr($str,0,$cutbyte+1);
return $str;
}
?>
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:겨울비 내려와 머리를 적시네
※ int ord(string string);
ord string에서 첫번째 문자의 아스키코드값을 반환합니다.
'PHP∵SCRIPT' 카테고리의 다른 글
정규표현식 (0) | 2014.04.03 |
---|---|
최대공약수 구하기 (유클리드 알고리즘) (0) | 2014.04.03 |
소수인지 확인하기 (유클리드 알고리즘) (0) | 2014.04.03 |
PHP를 이용한 이미지 사이즈 편집 (0) | 2014.04.03 |
PHP explode 함수를 이용한 문자열 분리 (0) | 2014.04.02 |
게시판검색이나 쇼핑몰에 유용한 자바스크립트 (0) | 2014.04.02 |
php 문자열 자르기, 비교, 찾기 함수, str_replace, substr ,strpos, explode 등등 정리 (0) | 2014.04.02 |
php 정규식 종류별 문자 추출 (0) | 2014.04.02 |
댓글