UTF-8 한글 초성 추출 (PHP)

UTF-8 한글 초성 분리 (PHP)
PHP 한글 초성 검색
PHP cho_hangul 함수

1 소스코드[ | ]

<?php
function utf8_strlen($str) { return mb_strlen($str, 'UTF-8'); }
function utf8_charAt($str, $num) { return mb_substr($str, $num, 1, 'UTF-8'); }
function utf8_ord($c) {
	$len = strlen($c);
	if($len <= 0) return false;
	$h = ord($c[0]);
	if ($h <= 0x7F) return $h;
	if ($h < 0xC2) return false;
	if ($h <= 0xDF && $len>1) return ($h & 0x1F) <<  6 | (ord($c[1]) & 0x3F);
	if ($h <= 0xEF && $len>2) return ($h & 0x0F) << 12 | (ord($c[1]) & 0x3F) <<  6 | (ord($c[2]) & 0x3F);		  
	if ($h <= 0xF4 && $len>3) return ($h & 0x0F) << 18 | (ord($c[1]) & 0x3F) << 12 | (ord($c[2]) & 0x3F) << 6 | (ord($c[3]) & 0x3F);
	return false;
}

function cho_hangul($str, $accept_nonhangul=false) {
	$cho = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
	$result = '';
	for ($i=0; $i<utf8_strlen($str); $i++) {
		$c = utf8_charAt($str, $i);
		$code = utf8_ord($c) - 44032;
		if ($code > -1 && $code < 11172) {
			$cho_idx = $code / 588;	  
			$result .= $cho[$cho_idx];
			continue;
		}
		if( $accept_nonhangul || in_array($c, $cho) ) {
			$result .= $c;
			continue;
		}
	}
	return $result;
}

var_dump( cho_hangul("안녕하세요") );  # string(15) "ㅇㄴㅎㅅㅇ"
var_dump( cho_hangul("안1녕하세요") ); # string(15) "ㅇㄴㅎㅅㅇ"
var_dump( cho_hangul("ㅇㄴㅎㅅㅇ") );  # string(15) "ㅇㄴㅎㅅㅇ"
var_dump( cho_hangul("ㅇㄶㅅㅇ") );    # string(9) "ㅇㅅㅇ"

var_dump( cho_hangul("안녕하세요", true) );  # string(15) "ㅇㄴㅎㅅㅇ"
var_dump( cho_hangul("안1녕하세요", true) ); # string(16) "ㅇ1ㄴㅎㅅㅇ"
var_dump( cho_hangul("ㅇㄴㅎㅅㅇ", true) );  # string(15) "ㅇㄴㅎㅅㅇ"
var_dump( cho_hangul("ㅇㄶㅅㅇ", true) );    # string(12) "ㅇㄶㅅㅇ"

2 is_chosungs()[ | ]

<?php
function utf8_strlen($str) { return mb_strlen($str, 'UTF-8'); }
function utf8_charAt($str, $num) { return mb_substr($str, $num, 1, 'UTF-8'); }
function utf8_ord($c) {
	$len = strlen($c);
	if($len <= 0) return false;
	$h = ord($c[0]);
	if ($h <= 0x7F) return $h;
	if ($h < 0xC2) return false;
	if ($h <= 0xDF && $len>1) return ($h & 0x1F) <<  6 | (ord($c[1]) & 0x3F);
	if ($h <= 0xEF && $len>2) return ($h & 0x0F) << 12 | (ord($c[1]) & 0x3F) <<  6 | (ord($c[2]) & 0x3F);		  
	if ($h <= 0xF4 && $len>3) return ($h & 0x0F) << 18 | (ord($c[1]) & 0x3F) << 12 | (ord($c[2]) & 0x3F) << 6 | (ord($c[3]) & 0x3F);
	return false;
}

function cho_hangul($str, $accept_nonhangul=false) {
	$cho = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
	$result = '';
	for ($i=0; $i<utf8_strlen($str); $i++) {
		$c = utf8_charAt($str, $i);
		$code = utf8_ord($c) - 44032;
		if ($code > -1 && $code < 11172) {
			$cho_idx = $code / 588;	  
			$result .= $cho[$cho_idx];
			continue;
		}
		if( $accept_nonhangul || in_array($c, $cho) ) {
			$result .= $c;
			continue;
		}
	}
	return $result;
}

function is_chosungs($str) {
	return cho_hangul($str) == $str;
}

var_dump( is_chosungs('ㅇㄴㅎㅅㅇ') ); # bool(true)

var_dump( is_chosungs('안녕하세요') );  # bool(false)
var_dump( is_chosungs('ㅇ1ㄴㅎㅅㅇ') ); # bool(false)
var_dump( is_chosungs('ㅇ ㄴㅎㅅㅇ') ); # bool(false)

var_dump( is_chosungs(str_replace('1','','ㅇ1ㄴㅎㅅㅇ')) ); # bool(true)
var_dump( is_chosungs(str_replace(' ','','ㅇ ㄴㅎㅅㅇ')) ); # bool(true)

// 한글 초성 이외 숫자나 영문자 표기시 false를 반환해야 한다.
var_dump( is_chosungs('1234') ); # bool(false)
var_dump( is_chosungs('hello') ); # bool(false)

3 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}