개요

laravel framework 에서는 문장을 slug 형식으로 만들어 주는 slug helper 를 제공합니다.

use Illuminate\Support\Str;

$slug = Str::slug('Laravel Framework is cool', '-');
// "laravel-framework-is-cool"
PHP


 하지만 저 함수는 한글등 아시아권 문자에 대한 고려가 되어 있지 않으므로 입력이 한글일 경우 모두 날려 버립니다.

use Illuminate\Support\Str;

$slug = Str::slug('한글 漢子 test', '-');
// "test"
PHP

만약 영어가 없는(한글, 한자, 일어만 있는) 입력이라면 slug 가 null 이 되는 문제가 있습니다.


이를 해결하기 위해서는 한글로 유지하는 별도의 slug 함수를 만드는 방법이 있지만 PHP 에서 제공하는 국제화 함수인 Intl extension 을 이용해서 한글 발음을 영어 단어로 음차(음역;transliteration)하는 방법도 있습니다.

$slug = transliterate_slug('한글 漢子 test', '-');
// "hangeul han zi test"
PHP


음차하기

음차 기능을 사용하려면 먼저 ext-intl 이 설치되어 있어야 합니다.

sudo apt install php8.0-intl
BASH


다음과 같이 Transliterator 클래스의 transliterate 기능을 사용해서 입력을 음차한 후에 slug 헬퍼에 전달해 주면 한글/한자 유실없이 slug 로 만들수 있습니다.

function transliterate_slug(string $value) : string
{
    $tr = \Transliterator::create('Any-Latin; Latin-ASCII');
    
    $tr_value = $tr->transliterate($value);
    
    return Str::slug($tr_value);
}
PHP
$v = 'test 한글  漢子 똠방';

$s = transliterate_slug($v);
// $s = "test-hangeul-han-zi-ttombang"
PHP


같이 보기

Ref