프로그래밍/PHP

[PHP] 문자열 부분 가져오기 (substr, mb_substr)

떨어지는 용 2017. 12. 18. 11:31

▶PHP 문자열 부분 가져오기 (substr, mb_substr)



▶설명



substr 함수

PHP 함수인 substr 함수에 대해 php.net에서는 아래와 같이 설명하고 있습니다.
문자열의 일부를 반환합니다.
그렇지만, 해당 함수는 영문 문자열에 바이트를 기준으로 가져오는 함수입니다.
UTF-8 문서에 경우 각 문자를 1~4Byte까지 사용하므로, 한글은 문자에 일부를 가져오는 경우 깨지는 경우가 있습니다.
그렇기 때문에 우리는 이를 해결 할 수 있는 함수인 mb_substr에 대해서도 함께 알아보겠습니다.

mb_substr 함수

PHP 함수인 mb_substrphp.net에서 substr과 동일한 설명을 가지고 있습니다.
문자열의 일부를 반환합니다.

그러면 무엇이 틀린 걸까요?

그건 바로 사용하는 인수 값이 틀립니다.


substr은 문자열, 시작 지점, 길이만을 인수로 사용하지만,

mb_substr은 문자열, 시작 지점, 길이, 현재 파일의 인코딩(=문자셋 혹은 charset)을 인수로 사용합니다.

mb_substr 함수를 이용하면 한글 문자열의 일부도 문제없이 가져올 수 있습니다.

▶사용법


강조 처리된 부분만 필수 입력 사항입니다.

substr( 문자열 ,  시작 지점,   길이 )


mb_substr( 문자열 ,  시작 숫자,   길이 , 인코딩 = mb_internal_encoding()  )


* 시작 숫자 :

- 음수가 아닌 경우 :  문자열의 처음을 0부터 세서, 시작 숫자 자리에서 시작한 문자열의 일부를 가져옵니다. (예를 들어, 문자열 'abcdef'에서 위치 0의 문자는 'a'이고, 위치 2의 문자는 'c'입니다.

- 음수인 경우 : 문자열의 끝을 기준으로 문자열의 일부를 가져옵니다.

- 문자열 길이보다 시작 숫자가 작은 경우, FALSE를 반환합니다.


* 길이 :

- 생략된 경우 : 시작 숫자부터 문자열의 끝까지를 가져옵니다.

- 양수인 경우 : 시작 숫자부터 길이만큼에 문자열의 일부를 가져옵니다.

- 음수인 경우 : 문자열의 끝부터 음수만큼의 문자를 제외한 문자열을 가져옵니다.

- 0인 경우 : FALSE 또는 NULL, 빈 무자열이 반환됩니다.


* 인코딩 : 값을 입력하지 않으면, 기본 문자 인코딩에서 사용되는 문자 인코딩을 가져옵니다.  [참고 ]

▶substr 함수 예제



코드

<?php
$example_english = "Hello world!";

echo "영어 : ".$example_english."<br/>";
echo "시작이 양수인 경우 #1  : ".substr($example_english, 1).'<br/>';
echo "시작이 양수인 경우 #2  : ".substr($example_english, 2).'<br/>';
echo "시작이 양수인 경우 #3  : ".substr($example_english, 3).'<br/>';
echo "시작이 양수인 경우 #4  : ".substr($example_english, 3, 3).'<br/>';
echo "시작이 양수인 경우 #5  : ".substr($example_english, 3, -1).'<br/>';
echo "시작이 양수인 경우 #6  : ".substr($example_english, -3, -1).'<br/>';

echo "<br/>";

echo "시작이 음수인 경우 #1  : ".substr($example_english, -1).'<br/>';
echo "시작이 음수인 경우 #2  : ".substr($example_english, -2).'<br/>';
echo "시작이 음수인 경우 #3  : ".substr($example_english, -3, 1).'<br/>';
echo "시작이 음수인 경우 #4  : ".substr($example_english, -3, -1).'<br/>';

echo "<br/>";

$example_korean = "안녕하세요. 세상!";
echo "한글 : ".$example_korean."<br/>";
echo "시작이 양수인 경우 #1  : ".substr($example_korean, 1).'<br/>';
echo "시작이 양수인 경우 #2  : ".substr($example_korean, 2).'<br/>';
echo "시작이 양수인 경우 #3  : ".substr($example_korean, 3).'<br/>';
echo "시작이 양수인 경우 #4  : ".substr($example_korean, 3, 3).'<br/>';
echo "시작이 양수인 경우 #5  : ".substr($example_korean, 3, -1).'<br/>';
echo "시작이 양수인 경우 #6  : ".substr($example_korean, -3, -1).'<br/>';

echo "<br/>";

echo "시작이 음수인 경우 #1  : ".substr($example_korean, -1).'<br/>';
echo "시작이 음수인 경우 #2  : ".substr($example_korean, -2).'<br/>';
echo "시작이 음수인 경우 #3  : ".substr($example_korean, -3, 1).'<br/>';
echo "시작이 음수인 경우 #4  : ".substr($example_korean, -3, -1).'<br/>';
?>


결과

영어 : Hello world!
시작이 양수인 경우 #1 : ello world!
시작이 양수인 경우 #2 : llo world!
시작이 양수인 경우 #3 : lo world!
시작이 양수인 경우 #4 : lo 
시작이 양수인 경우 #5 : lo world
시작이 양수인 경우 #6 : ld

시작이 음수인 경우 #1 : !
시작이 음수인 경우 #2 : d!
시작이 음수인 경우 #3 : l
시작이 음수인 경우 #4 : ld

한글 : 안녕하세요. 세상!
시작이 양수인 경우 #1 : ��녕하세요. 세상!
시작이 양수인 경우 #2 : �녕하세요. 세상!
시작이 양수인 경우 #3 : 녕하세요. 세상!
시작이 양수인 경우 #4 : 녕
시작이 양수인 경우 #5 : 녕하세요. 세상
시작이 양수인 경우 #6 : ��

시작이 음수인 경우 #1 : !
시작이 음수인 경우 #2 : �!
시작이 음수인 경우 #3 : �
시작이 음수인 경우 #4 : ��


▶mb_substr 함수 예제



코드

<?php
define('SERVER_CHARSET', 'UTF-8');

$example_english = "Hello world!";

echo "영어 : ".$example_english."<br/>";
echo "시작이 양수인 경우 #1  : ".mb_substr($example_english, 1, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #2  : ".mb_substr($example_english, 2, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #3  : ".mb_substr($example_english, 3, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #4  : ".mb_substr($example_english, 3, 3, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #5  : ".mb_substr($example_english, 3, -1, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #6  : ".mb_substr($example_english, -3, -1, SERVER_CHARSET).'<br/>';

echo "<br/>";

echo "시작이 음수인 경우 #1  : ".mb_substr($example_english, -1, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #2  : ".mb_substr($example_english, -2, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #3  : ".mb_substr($example_english, -3, 1, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #4  : ".mb_substr($example_english, -3, -1, SERVER_CHARSET).'<br/>';

echo "<br/>";

$example_korean = "안녕하세요. 세상!";
echo "한글 : ".$example_korean."<br/>";
echo "시작이 양수인 경우 #1  : ".mb_substr($example_korean, 1, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #2  : ".mb_substr($example_korean, 2, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #3  : ".mb_substr($example_korean, 3, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #4  : ".mb_substr($example_korean, 3, 3, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #5  : ".mb_substr($example_korean, 3, -1, SERVER_CHARSET).'<br/>';
echo "시작이 양수인 경우 #6  : ".mb_substr($example_korean, -3, -1, SERVER_CHARSET).'<br/>';

echo "<br/>";

echo "시작이 음수인 경우 #1  : ".mb_substr($example_korean, -1, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #2  : ".mb_substr($example_korean, -2, NULL, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #3  : ".mb_substr($example_korean, -3, 1, SERVER_CHARSET).'<br/>';
echo "시작이 음수인 경우 #4  : ".mb_substr($example_korean, -3, -1, SERVER_CHARSET).'<br/>';
?>


결과

영어 : Hello world!
시작이 양수인 경우 #1 : ello world!
시작이 양수인 경우 #2 : llo world!
시작이 양수인 경우 #3 : lo world!
시작이 양수인 경우 #4 : lo 
시작이 양수인 경우 #5 : lo world
시작이 양수인 경우 #6 : ld

시작이 음수인 경우 #1 : !
시작이 음수인 경우 #2 : d!
시작이 음수인 경우 #3 : l
시작이 음수인 경우 #4 : ld

한글 : 안녕하세요. 세상!
시작이 양수인 경우 #1 : 녕하세요. 세상!
시작이 양수인 경우 #2 : 하세요. 세상!
시작이 양수인 경우 #3 : 세요. 세상!
시작이 양수인 경우 #4 : 세요.
시작이 양수인 경우 #5 : 세요. 세상
시작이 양수인 경우 #6 : 세상

시작이 음수인 경우 #1 : !
시작이 음수인 경우 #2 : 상!
시작이 음수인 경우 #3 : 세
시작이 음수인 경우 #4 : 세상