SlugGenerator.app

JavaScript・Python・PHPでテキストをスラッグ化する方法

7 分で読了

テキストのスラッグ化—人間が読める文字列をURLセーフなスラッグに変換すること—はウェブ開発でよくある作業です。ブログ、ECサイト、APIのいずれを作る場合でも、タイトルなどのテキストからきれいなURLスラッグを生成する必要があります。本ガイドでは、最も人気のあるサーバーサイド言語3つでの方法を紹介します。

コードを書きたくない場合は、当サイトのスラッグ化オンラインツールを使えば、ブラウザ上で瞬時にテキストをスラッグへ変換できます。

JavaScript / Node.js

slugify ライブラリを使う

JavaScriptで最も一般的なのは slugify という npm パッケージです。

npm install slugify
const slugify = require('slugify');

const title = "Café Menu — Special Édition!";
const slug = slugify(title, {
  lower: true,
  strict: true,
  trim: true
});

console.log(slug);
// Output: cafe-menu-special-edition

オプションの説明:

  • lower: true — 小文字に変換する
  • strict: true — 英数字と区切り文字以外をすべて取り除く
  • trim: true — 先頭・末尾の区切り文字を削除する

自前で実装する

依存を増やしたくない場合は、最小限のスラッグ化関数を示します。

function slugify(text) {
  return text
    .normalize('NFKD')
    .replace(/[\u0300-\u036f]/g, '')
    .toLowerCase()
    .trim()
    .replace(/[^a-z0-9\s-]/g, '')
    .replace(/[\s_]+/g, '-')
    .replace(/-+/g, '-')
    .replace(/^-|-$/g, '');
}

これはUnicode正規化でアクセント付き文字を処理し、小文字に変換し、特殊文字を除去し、空白を単一のハイフンにまとめます。

Python

python-slugify を使う

Pythonのスラッグ化の定番ライブラリは python-slugify です。

pip install python-slugify
from slugify import slugify

title = "Café Menu — Special Édition!"
slug = slugify(title)

print(slug)
# Output: cafe-menu-special-edition

python-slugify は内部で text-unidecode ライブラリを使って音訳を行い、CJKを含む幅広いUnicode文字に対応します。

Django 組み込みの slugify

Djangoを使っているなら、組み込みのslugifyユーティリティがあります。

from django.utils.text import slugify

slug = slugify("My Blog Post Title")
# Output: my-blog-post-title

注意: Djangoの slugify は既定では音訳を行いません。アクセント付き文字には unidecode と組み合わせてください。

PHP

Laravel の Str::slug()

Laravelはきれいなスラッグヘルパーを提供します。

use Illuminate\Support\Str;

$slug = Str::slug("Café Menu — Special Édition!");
// Output: cafe-menu-special-edition

Str::slug() は音訳・小文字化・特殊文字の除去を一度の呼び出しで処理します。

自前で実装する

フレームワークなしの場合のPHPスラッグ化関数です。

function slugify(string $text): string {
    $text = transliterator_transliterate(
        'Any-Latin; Latin-ASCII; Lower()',
        $text
    );
    $text = preg_replace('/[^a-z0-9\s-]/', '', $text);
    $text = preg_replace('/[\s_]+/', '-', $text);
    $text = preg_replace('/-+/', '-', $text);
    return trim($text, '-');
}

これはPHPの intl 拡張を音訳に使います。php.iniintl 拡張が有効になっていることを確認してください。

比較表

機能JS (slugify)Python (python-slugify)PHP (Laravel)
音訳基本ラテンフルUnicodeフルUnicode
区切り文字の指定
最大長不可不可(手動)
CJK対応不可一部

ライブラリとオンラインツールの使い分け

実行時にプログラムでスラッグを生成する必要があるとき—たとえばユーザーがブログ記事を作成した際にURLを自動生成する場合—はライブラリを使いましょう。

一度きりのスラッグが欲しいときや、タイトルがURLとしてどう見えるかをすぐ確認したいときはオンラインツールを使いましょう。当サイトのテキストをスラッグに変換するツールは、区切り文字の指定・最大長・音訳に対応しており、ライブラリで設定するようなオプションをコードを書かずに使えます。