홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송
PHP 한글 문자열 자르기
11년 전
[PHP]  한글 문자열 자르기

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에서 첫번째 문자의 아스키코드값을 반환합니다.

추천추천 : 193 추천 목록
번호 제목
3,033
 PHP 정규식 정리
3,032
 PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
3,031
 php 크롤링 또는 파싱 함수, 정규식 모음
3,030
 제이쿼리 기본 명령어
3,029
 웹페이지 가로 모드세로 모드 인식하기
3,028
 모바일 웹 화면 강제 회전(가로모드 고정)
3,027
 [HTML5]에서 frameset 대체 방법과 iframe 속성
3,026
 HTML <Audio> 사용법
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
3,021
 여러 도메인들 간 쿠키 공유하기
3,020
 태그 사이에 있는 텍스트를 추출
3,019
 [JQuery] textbox focus on off일때 숫자 콤마 보여주기
3,018
 쿠키 생성,가져오기,삭제
3,017
 사용자 함수 모음
3,016
 마우스,키보드 제한 ( 오른쪽클릭,드래그,영역선택등..)
3,015
 [HTML5] <video> - DOM으로 제어하기
3,014
 HTML5 video 태그에서 영상 좌우반전
3,013
 PHP - 특정 태그 및 문자열 추출, 제거
3,012
 [PHP] define과 defined의 차이
3,011
 우클릭 완벽차단 스크립트
3,010
 iframe 높이 100% 맞추기
3,009
 curl 함수를 이용한 HTTP REFERER 변경
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.