テキストのSlugify(URL)

テキストをURLに適したスラッグに正規化します。小文字化、区切り文字の設定、カスタム停止語の削除をサポートします。

パラメータと入力

推奨:- または _、1〜3文字以内

結果

なぜスラッグ化が必要ですか?

🔍 SEO最適化

URLに含まれるキーワードは、検索エンジンがページ内容を理解し、ランキングを向上させるのに役立ちます。例:example.com/blog/how-to-learn-javascript は example.com/blog/123 より優れています。

👁️ 読みやすさと共有性

ユーザーはURLを見ただけでコンテンツの内容を把握でき、ソーシャルメディアでの共有や記憶、手動入力がしやすくなります。

💻 システム互換性

特殊文字によるファイル名やURLのエラーを回避し、Windows/Linux/Macなどのプラットフォーム間で互換性を確保し、エンコーディング問題を防ぎます。

🗄️ データベースに最適

ユーザー名やタグなどの一意の識別子として使用し、SQLインジェクションのリスクを回避し、インデックス作成とクエリ実行を容易にします。

スラッグ化とは?

スラッグとは、URLやファイル名、識別子として使用するためにテキストを標準化した短い文字列です。主な処理には、大文字・小文字の統一、句読点の削除、単語を区切り文字で連結することが含まれます。

  • ASCII優先:アクセント記号や特殊文字を可能な限り削除し、アルファベット・数字・スペースのみを保持
  • Unicode互換:ほとんどの言語の文字をNFKD標準化して処理
  • URL安全:結果はアルファベット・数字・区切り文字のみで構成され、パスとして直接使用可能

使用シナリオ

ブログ記事のURL

JavaScriptを学ぶ方法

how-to-learn-javascript

ファイル名

製品要件仕様書 v2.0.docx

product-requirements-v2-0.docx

データベース識別子

ユーザー-張三

user-zhang-san

よくある質問

Q: 中文文字はどのように処理されますか?

A: デフォルトでは音符を削除し、ピンインのアルファベットを保持します。純粋な中国語は空になる可能性があるため、事前に手動でピンインに変換してからslug化するか、中国語ピンイン変換ツールをご利用ください。

Q: 結果が空になるのはなぜですか?

A: 入力がすべて句読点/記号/空白文字であるか、停止語フィルターを有効にした結果、残る単語がなくなった可能性があります。停止語オプションを無効化するか、入力内容を調整してください。

Q: 区切り文字は - と _ のどちらを使えばよいですか?

A: SEOの観点からは -(ハイフン)を推奨します。Googleはこれをスペースと認識します。一方、_(アンダースコア)は連結文字と見なされるため、単語の区切りに適していません。ファイル名の場合はどちらでも構いません。

Q: Slugの長さに制限はありますか?

A: 技術的には制限はありませんが、URLの表示とSEOの観点から50文字以内に抑えることを推奨します。長すぎるslugは検索エンジンに切断される可能性があります。

ベストプラクティス

推奨される方法

  • 短くする(50文字未満を推奨)
  • 特殊文字は使用せず、文字・数字・区切り文字のみを使用する
  • 大文字・小文字の区別による問題を避けるために小文字に統一する
  • 意味の薄い停止語を削除して語義の密度を高める

避けるべき方法

  • ID、メールアドレス、パスワードなどの機密情報を含めない
  • 特殊文字(@#$%^&*など)を使用しない
  • 空白文字や連続した区切り文字を残さない
  • 同じ単語を繰り返し使用しない

技術的説明

Unicode正規化:

NFKD分解 + 組合せ音標(\p{M})の削除により、CaféをCafeに変換します。主なラテン文字セットをサポートしています。

停止語リスト:

英語の一般的な停止語(a/an/the/and/or/of/to/in/on/for/at/by/with)に基づいており、カスタマイズして拡張可能です。中国語の停止語は別途処理が必要です。

ブラウザ互換性:

ES6+ および Unicode正規表現(\p{...})のサポートが必要です。現代のブラウザ(Chrome 64+、Firefox 78+、Safari 11.1+)ではすべて対応しています。

プログラミング言語で Slug を生成する方法

JavaScript

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

PHP

function slugify($text) {
  $text = mb_strtolower($text);
  $text = iconv("UTF-8", "ASCII//TRANSLIT", $text);
  $text = preg_replace("/[^\w\s-]/", "", $text);
  $text = preg_replace("/[\s_-]+/", "-", $text);
  return trim($text, "-");
}

Python

import re
import unicodedata

def slugify(text):
    text = text.lower()
    text = unicodedata.normalize("NFKD", text)
    text = text.encode("ascii", "ignore").decode("ascii")
    text = re.sub(r"[^\w\s-]", "", text)
    text = re.sub(r"[\s_-]+", "-", text)
    return text.strip("-")

Go

import (
    "regexp"
    "strings"
    "golang.org/x/text/unicode/norm"
)

func Slugify(text string) string {
    text = strings.ToLower(text)
    text = norm.NFKD.String(text)
    re := regexp.MustCompile(`[^\w\s-]`)
    text = re.ReplaceAllString(text, "")
    re = regexp.MustCompile(`[\s_-]+`)
    text = re.ReplaceAllString(text, "-")
    return strings.Trim(text, "-")
}

Ruby

require "unicode"

def slugify(text)
  text = text.downcase
  text = Unicode.nfkd(text).gsub(/[^\x00-\x7F]/, "")
  text = text.gsub(/[^\w\s-]/, "")
  text = text.gsub(/[\s_-]+/, "-")
  text.strip.gsub(/^-+|-+$/, "")
end

Java

import java.text.Normalizer;

public static String slugify(String text) {
    text = text.toLowerCase();
    text = Normalizer.normalize(text, Normalizer.Form.NFKD);
    text = text.replaceAll("[^\\w\\s-]", "");
    text = text.replaceAll("[\\s_-]+", "-");
    return text.replaceAll("^-+|-+$", "");
}