[code]
class Josa
{
private static function execute($str, $firstVal, $secondVal)
{
try {
// $laststr = $str{mb_strlen($str) – 1};
$laststr = mb_ord( mb_substr($str, mb_strlen($str) – 1, 1) );
// 한글의 제일 처음과 끝의 범위밖일 경우는 오류
if ($laststr < 0xAC00 || $laststr > 0xD7A3) {
return $str;
}
$lastCharIndex = ($laststr – 0xAC00) % 28;
// 종성인덱스가 0이상일 경우는 받침이 있는경우이며 그렇지 않은경우는 받침이 없는 경우
if($lastCharIndex > 0) {
// 받침이 있는경우
// 조사가 ‘로’인경우 ‘ㄹ’받침으로 끝나는 경우는 ‘로’ 나머지 경우는 ‘으로’
if($firstVal == ‘으로’ && $lastCharIndex == 8) {
$str .= $secondVal;
} else {
$str .= $firstVal;
}
} else {
// 받침이 없는 경우
$str .= $secondVal;
}
} catch (Exception $e) {
//e.printStackTrace();
}
return $str;
}
public static function convert($str) {
$pattern = ‘~([^\s]+)\{([^\}]+)\}([^\s])~isu’;
return preg_replace_callback($pattern, function ($matches) {
return self::execute($matches[1], $matches[2], $matches[3]);
}, $str);
}
}
[/code]
사용예
[code]
echo Josa::convert(“사냥꾼{이}가 오리{을}를 사냥해서 고기{을}를 다듬고 요리{을}를 만들어 먹고 있었습니다. 늑대{이}가 나타나 ‘사냥꾼{아}야~ 오리{아}야~’ 소리쳤습니다.”);
// 사냥꾼이 오리를 사냥해서 고기를 다듬고 요리를 만들어 먹고 있었습니다. 늑대가 나타나 ‘사냥꾼아~ 오리야~’ 소리쳤습니다.[/code]
참고: https://okky.kr/article/549842