Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

[PHP] 문자열 자르고 말줄임표 붙이는 함수

function text_dot($text, $len){
	$text = strip_tags($text);
	if(strlen($text)<=$len) {
		return $text;
	} else {
		$text = htmlspecialchars_decode($text);
		$text = mb_strcut($text, 0, $len, 'utf-8');
		$text = htmlspecialchars($text);
		return $text."…";
	}
}

위 함수를 사용하면 글자를 자른 후 말줄임표를 붙인다.

특징1 – htmlspecialchars_decode 함수

일단 htmlspecialchars_decode 함수를 사용했다.

HTML에서 <나 >를 표현하려면 &lt; 이나 &gt; 같은 형태로 써 줘야 한다.

자, <한겨레> 라는 문자열이 있다고 생각해 보자. 앞에서부터 7바이트를 자른다고 생각하자. 그러면 ‘<한겨’ 라고 나올 것이라고 생각할 것이다. 그러나 아니다. 함수는 아마도 ‘&lt;한’ 만 리턴할 것이다. (UTF-8일 때 영문은 1바이트, 한글은 3바이트 처리된다.)

즉, HTML에서 사용하는 특수문자의 문자열이 잘리는 경우를 염두에 둬야 하는 것이다.

그래서 DB 등에 저장된 문자열 형태인 ‘&lt;한겨레&gt;’를 htmlspecialchars_decode() 를 이용해서 ‘<한겨레>’로 만든 다음 문자열을 자르는 것이다.

특징2 –mb_strcut 함수

보통 문자열을 자를 때 substr을 사용할 거다. 그러나 이건 알파벳에 최적화된 놈이다. 이걸로 한글을 자르면 글자가 깨지는 경우가 생긴다.

그래서 mb_strcut이나 mb_substr이라는 함수가 새로 나왔다. (새로 나왔다지만 이미 PHP 4.0.6 부터 있었던 것 같다;; 이 두 함수는 다른 방법으로 같은 역할을 수행한다. 단, mb_substr은 인자값에서 1이 글자수고, mb_strcut은 바이트수다.) 이들 함수의 mb는 multi-byte의 약자다.

이 함수를 사용하면 한글도 깨지지 않고 잘 잘린다.

예제

아래와 같이 test.php 따위의 파일을 만들어서 실행해 보면 함수를 잘 이해할 수 있을 것이다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?
$str="abc와!!!";
echo "원래 문자열: $str <br/>";
$after_substr4=substr($str,0,4);
$after_substr5=substr($str,0,5);
$after_substr6=substr($str,0,6);
$after_substr7=substr($str,0,7);
$after_substr8=substr($str,0,8);
$after_substr9=substr($str,0,9);
echo "after substr 4: $after_substr4 <br/>";
echo "after substr 5: $after_substr5 <br/>";
echo "after substr 6: $after_substr6 <br/>";
echo "after substr 7: $after_substr7 <br/>";
echo "after substr 8: $after_substr8 <br/>";
echo "after substr 9: $after_substr9 <br/>";

$after_mb_strcut4 = mb_strcut($str,0,4, "UTF-8" );
$after_mb_strcut5 = mb_strcut($str,0,5, "UTF-8" );
$after_mb_strcut6 = mb_strcut($str,0,6, "UTF-8" );
$after_mb_strcut7 = mb_strcut($str,0,7, "UTF-8" );
$after_mb_strcut8 = mb_strcut($str,0,8, "UTF-8" );
$after_mb_strcut9 = mb_strcut($str,0,9, "UTF-8" );
echo "after mb_strcut 4: $after_mb_strcut4 <br/>";
echo "after mb_strcut 5: $after_mb_strcut5 <br/>";
echo "after mb_strcut 6: $after_mb_strcut6 <br/>";
echo "after mb_strcut 7: $after_mb_strcut7 <br/>";
echo "after mb_strcut 8: $after_mb_strcut8 <br/>";
echo "after mb_strcut 9: $after_mb_strcut9 <br/>";

/*결과 -
원래 문자열: abc와!!!
after substr 4: abc�
after substr 5: abc�
after substr 6: abc와
after substr 7: abc와!
after substr 8: abc와!!
after substr 9: abc와!!!
after mb_strcut 4: abc
after mb_strcut 5: abc
after mb_strcut 6: abc와
after mb_strcut 7: abc와!
after mb_strcut 8: abc와!!
after mb_strcut 9: abc와!!!
*/
?>

substr로 4바이트나 5바이트를 잘랐을 때 한글이 깨지는 것을 알 수 있다. 특수문자와 영문은 1바이트, 한글은 3바이트 처리된다는 것도 알 수 있다.

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (6개)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다