JavaScript・Python・PHPでテキストをスラッグ化する方法
テキストのスラッグ化—人間が読める文字列を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.ini で intl 拡張が有効になっていることを確認してください。
比較表
| 機能 | JS (slugify) | Python (python-slugify) | PHP (Laravel) |
|---|---|---|---|
| 音訳 | 基本ラテン | フルUnicode | フルUnicode |
| 区切り文字の指定 | 可 | 可 | 可 |
| 最大長 | 不可 | 可 | 不可(手動) |
| CJK対応 | 不可 | 可 | 一部 |
ライブラリとオンラインツールの使い分け
実行時にプログラムでスラッグを生成する必要があるとき—たとえばユーザーがブログ記事を作成した際にURLを自動生成する場合—はライブラリを使いましょう。
一度きりのスラッグが欲しいときや、タイトルがURLとしてどう見えるかをすぐ確認したいときはオンラインツールを使いましょう。当サイトのテキストをスラッグに変換するツールは、区切り文字の指定・最大長・音訳に対応しており、ライブラリで設定するようなオプションをコードを書かずに使えます。