한국어 조사 처리 함수

<?php

function proc_josa($ex) {

$pps = ["은(는)","이(가)","을(를)","과(와)"];

foreach( $pps as $pp ) {

$ex = preg_replace_callback("/(.)".preg_quote($pp)."/u",

function($matches) use($pp) {

$ch = $matches[1];

$has_jongsung = true;

if(preg_match('/[가-힣]/',$ch)) {

$code = (ord($ch{0})&0x0F)<<12 | (ord($ch{1})&0x3F)<<6 | (ord($ch{2})&0x3F);

$has_jongsung = ( ($code-16)%28 != 0 );

}

else if(preg_match('/[2459]/', $ch)) $has_jongsung = false;

return $ch.mb_substr($pp,($has_jongsung?0:2),1);

}, $ex);

}

return $ex;

}

var_dump( proc_josa("말이(가) 노래한다") );

var_dump( proc_josa("매이(가) 노래한다") );

var_dump( proc_josa("바람이(가) 노래한다") );

var_dump( proc_josa("황소이(가) 노래한다") );

# string(19) "말이 노래한다"

# string(19) "매가 노래한다"

# string(22) "바람이 노래한다"

# string(22) "황소가 노래한다"

var_dump( proc_josa("욕심많은 말을(를) 쓰러뜨린 자") );

var_dump( proc_josa("욕심많은 매을(를) 쓰러뜨린 자") );

var_dump( proc_josa("욕심많은 바람을(를) 쓰러뜨린 자") );

var_dump( proc_josa("욕심많은 황소을(를) 쓰러뜨린 자") );

# string(36) "욕심많은 말을 쓰러뜨린 자"

# string(36) "욕심많은 매를 쓰러뜨린 자"

# string(39) "욕심많은 바람을 쓰러뜨린 자"

# string(39) "욕심많은 황소를 쓰러뜨린 자"

var_dump( proc_josa("나은(는) 너을(를) 조심한다") );

var_dump( proc_josa("갑이(가) 을을(를) 사랑한다") );

var_dump( proc_josa("말과(와) 매과(와) 바람과(와) 황소") );

var_dump( proc_josa("0과(와) 1과(와) 2과(와) 3과(와) 4과(와) 5의 곱은(는)?") );

# string(26) "나는 너를 조심한다"




function josa($str) { $josa = '이가은는을를과와으로'; return preg_replace_callback( "/(.)\\{([{$josa}])\\}/u", function($matches) use($josa) { list($_, $last, $pp) = $matches; $pp1 = $pp2 = $pp; $idx = mb_strpos($josa, $pp); ($idx % 2) ? ($pp1 = mb_substr($josa,--$idx,1)) : ($pp2 = mb_substr($josa,++$idx,1)); $pp1 .= ($pp1 === '으') ? $pp2 : ''; if (strlen($last) > 1) { $last_ucs2 = mb_convert_encoding($last, 'UCS-2BE', 'UTF-8'); $code = (hexdec(bin2hex($last_ucs2)) - 16) % 28; } else { $code = (strpos('2459', $last) > -1) ? 0 : 1; } return $last.($code ? $pp1 : $pp2); }, $str ); } // 사용예 echo josa('한글{와} 컴퓨터의 한글2015{은} 언제 출시될까.'), "\n"; echo josa('영등포{은} 문제없습니다.'), "\n"; echo josa('집{로} 가는 길'), "\n"; 

# string(26) "갑이 을을 사랑한다"

# string(30) "말과 매와 바람과 황소"

# string(37) "0과 1과 2와 3과 4와 5의 곱은?"


0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

PHP

번호 제목 글쓴이 날짜 조회수
18 [PHP] 정규식 : 개인정보 이름 * 표시하기 [출처] [PHP] 정규식 : 개인정보 이름 * 표시하기 Hot 관리자 12-31 167
17 [PHP] 구글 캡차(Captcha) 달기 - V3, V2 버전 관리자 12-12 82
16 PhpSpreadsheet 설정 샘플 코드 관리자 06-21 305
15 PHP & JavaScript 엑셀 파일 다운로드 및 업로드 구현 (PhpSpreadsheet 사용) 관리자 06-21 305
14 PHP 스크립트에서 JSON 반환하기 관리자 11-26 2,597
13 PhpSpreadsheet 설치 및 사용법 정리 관리자 11-07 606
12 PHP 프로그램에서 BULK INSERT 문장을 만드는 방법 관리자 07-07 532
11 PHP 문자 암호화하여 Form 전송하기 관리자 07-07 509
10 전화번호 체크하기(휴대전화, 유선, 대표번호 등등) 관리자 07-03 463
9 get vimeo thumb 관리자 04-14 474
8 PHP 에서 MySQL 사용하기 (연결, DB&테이블 생성, 데이터 삽입/선택) 관리자 04-13 637
7 [PHP] 특정 영역 자동 스크린샷 저장 후 가장 최신 이미지 DB 저장 관리자 03-15 549
6 GD PHP TEXT ALIGN 한글 관리자 03-14 448
5 [PHP] 이미지파일에 텍스트 넣기 (라이브러리) 관리자 03-12 802
4 PHP 이미지 워터마크(텍스트&이미지) 삽입하기 관리자 03-11 458
3 한글 종성유무에 맞는 조사(은/는/이/가/을/를/과/와) 변환 관리자 06-22 690
2 한국어 조사 처리 함수 관리자 04-08 805
1 PHP 에서 callback 함수를 이용하여서 mysql select row 함수 개발하는 방법 관리자 10-22 945