ToolDeck

Trình Tạo Slug

Chuyển đổi bất kỳ văn bản nào thành slug URL sạch và thân thiện

Thử ví dụ
Dấu phân cách

Văn bản đầu vào

Slug

Chạy cục bộ · An toàn để dán thông tin bí mật
Slug sẽ hiển thị ở đây…

URL Slug là gì?

URL slug là phần của địa chỉ web xác định một trang cụ thể dưới dạng con người có thể đọc được. Trong URL https://example.com/blog/my-first-post, slug là my-first-post. Trình tạo slug chuyển đổi tiêu đề hoặc mô tả trang thành một chuỗi chỉ chứa chữ thường, số và dấu gạch ngang (hoặc ký tự phân cách khác). Quá trình này loại bỏ khoảng trắng, xóa dấu nhấn và dấu phụ, bỏ ký tự đặc biệt, và chuẩn hóa khoảng trắng thành một dấu phân cách duy nhất.

Tạo slug là một bước tiêu chuẩn trong các hệ thống quản lý nội dung, công cụ tạo trang tĩnh, nền tảng blog, và bất kỳ ứng dụng nào tạo URL từ dữ liệu người dùng nhập vào. WordPress, Ghost, Hugo, Next.js, và Django đều tích hợp logic tạo slug vì URL dễ đọc cải thiện cả khả năng sử dụng lẫn tối ưu hóa công cụ tìm kiếm. Một slug được tạo đúng cách cho người dùng biết nội dung của trang trước khi họ nhấp vào liên kết.

Thuật ngữ "slug" xuất phát từ ngành xuất bản báo chí, nơi nó chỉ một nhãn ngắn dùng để nhận diện một bài viết trong quá trình sản xuất. Trong phát triển web, slug thực hiện cùng chức năng đó: là một mã định danh gọn, duy nhất, an toàn với URL, được tạo ra từ tiêu đề hoặc tên dài hơn. Vì slug được tạo theo chương trình, một trình tạo slug đáng tin cậy đảm bảo tính nhất quán trên mọi trang và ngôn ngữ.

Tại sao nên dùng Trình Tạo Slug này?

Tạo slug URL thủ công dễ gặp lỗi. Quên xóa dấu nhấn, để lại dấu gạch ngang đôi, hoặc bỏ sót trường hợp ngoại lệ với đầu vào Unicode đều có thể tạo ra URL hỏng hoặc xấu. Công cụ này xử lý các vấn đề đó tự động.

Chuyển đổi tức thì
Dán hoặc gõ bất kỳ văn bản nào và xem slug cập nhật theo thời gian thực. Không cần gửi biểu mẫu, không tải lại trang. Hữu ích khi bạn cần slug cho một loạt tiêu đề bài viết hoặc tên sản phẩm.
🔒
Xử lý ưu tiên quyền riêng tư
Toàn bộ quá trình tạo slug chạy trong trình duyệt của bạn. Văn bản của bạn không bao giờ rời khỏi trang, vì vậy bạn có thể chuyển đổi tiêu đề nháp, tên dự án nội bộ, hoặc tên sản phẩm chưa phát hành một cách an toàn.
⚙️
Đầu ra có thể tùy chỉnh
Chọn giữa dấu gạch ngang, gạch dưới, hoặc dấu chấm làm ký tự phân cách. Bật hoặc tắt chữ thường. Điều này bao gồm các quy ước slug phổ biến nhất trên các framework và CMS khác nhau.
🌐
Xử lý Unicode và dấu nhấn
Trình tạo áp dụng chuẩn hóa NFD để loại bỏ dấu phụ khỏi các ký tự có dấu. Café trở thành cafe, naïve trở thành naive. Các ký tự không thuộc Latin không thể phiên âm được loại bỏ gọn gàng.

Các trường hợp sử dụng Trình Tạo Slug

Lập trình viên Frontend — Lên kế hoạch tuyến đường
Tạo slug nhất quán cho các tuyến đường trang trong React Router, Next.js, hoặc Nuxt trước khi kết nối các đoạn tuyến đường động. Kiểm tra rằng tiêu đề có ký tự đặc biệt tạo ra đường dẫn sạch.
Kỹ sư Backend — Mã định danh cơ sở dữ liệu
Tạo slug an toàn với URL cho các bản ghi cơ sở dữ liệu cần mã định danh dễ đọc. Slug hoạt động tốt như khóa phụ bên cạnh ID số cho các điểm cuối REST API như /api/products/tai-nghe-khong-day.
DevOps — Đặt tên tệp cấu hình
Chuyển đổi tên dịch vụ hoặc nhãn môi trường thành chuỗi an toàn với hệ thống tệp cho các tệp cấu hình, thẻ Docker image, hoặc tên tài nguyên Kubernetes nơi ký tự đặc biệt không được phép.
Kỹ sư QA — Tạo dữ liệu kiểm thử
Nhanh chóng tạo các biến thể slug từ tiêu đề trường hợp kiểm thử để xác minh định tuyến URL, quy tắc chuyển hướng, và hành vi thẻ canonical trên các môi trường staging.
Kỹ sư dữ liệu — Chuẩn hóa tên cột
Chuẩn hóa tiêu đề cột lộn xộn từ các tệp CSV hoặc Excel nhập vào thành mã định danh snake_case hoặc kebab-case nhất quán để sử dụng trong lược đồ cơ sở dữ liệu hoặc quy trình xử lý dữ liệu.
Sinh viên — Dự án CMS và Blog
Tìm hiểu cách tạo slug hoạt động khi xây dựng blog với WordPress, Jekyll, hoặc CMS tùy chỉnh. Sử dụng công cụ này để so sánh slug thủ công của bạn với một triển khai tham chiếu.

Quy tắc Tạo Slug và Xử lý Ký tự

Tạo slug tuân theo một chuỗi chuyển đổi có thể dự đoán. Hiểu từng bước giúp bạn gỡ lỗi đầu ra không mong đợi hoặc xây dựng hàm slugify của riêng mình.

  1. 1. Chuẩn hóa Unicode (NFD)
    Phân tách các ký tự kết hợp thành ký tự cơ sở + dấu kết hợp. Ví dụ, é (U+00E9) trở thành e + dấu huyền kết hợp (U+0301). Điều này làm cho dấu phụ có thể loại bỏ được ở bước tiếp theo.
  2. 2. Loại bỏ dấu phụ
    Xóa tất cả ký tự trong khối Dấu Diacritical Kết hợp Unicode (U+0300–U+036F). Sau bước này, café trở thành cafe và Ñ trở thành N.
  3. 3. Xóa ký tự đặc biệt
    Thay thế bất kỳ ký tự nào không phải chữ cái, chữ số, khoảng trắng, hoặc dấu gạch ngang bằng khoảng trắng. Điều này loại bỏ dấu câu, ký hiệu, và các ký tự không có tương đương ASCII.
  4. 4. Cắt và thu gọn khoảng trắng
    Xóa khoảng trắng đầu và cuối, sau đó thu gọn tất cả các chuỗi khoảng trắng, gạch dưới, hoặc dấu gạch ngang liên tiếp thành một ký tự phân cách duy nhất được chọn.
  5. 5. Áp dụng kiểu chữ và ký tự phân cách
    Chuyển đổi sang chữ thường (tùy chọn) và nối các từ với ký tự phân cách được chọn: dấu gạch ngang (-), gạch dưới (_), hoặc dấu chấm (.).

Tham chiếu Chuyển đổi Ký tự

Bảng dưới đây cho thấy cách các ký tự phổ biến được xử lý trong quá trình tạo slug:

Đầu vàoĐầu raQuy tắc áp dụng
Hello Worldhello-worldLowercase + space → hyphen
Café au Laitcafe-au-laitNFD normalization strips é → e
naïve résuménaive-resumeMultiple diacritics removed
Price: $9.99!price-9-99Symbols ($, !, :) removed
too many too-manyWhitespace trimmed and collapsed
one--two___threeone-two-threeMixed separators collapsed
Привет мирprivet-mirCyrillic (if transliteration) or removed
file_name.txtfile-name-txtDots and underscores replaced
React & Vuereact-vueAmpersand removed
2026-03-302026-03-30Digits and hyphens preserved

Ví dụ mã nguồn

Tạo slug trong các ngôn ngữ và framework phổ biến. Mỗi ví dụ xử lý chuẩn hóa Unicode, loại bỏ dấu phụ, và chèn ký tự phân cách.

JavaScript
function slugify(text, separator = '-') {
  return text
    .normalize('NFD')                   // decompose accented chars
    .replace(/[\u0300-\u036f]/g, '')    // strip diacritics
    .toLowerCase()
    .replace(/[^\w\s-]/g, ' ')          // drop special chars
    .trim()
    .replace(/[\s_-]+/g, separator)     // collapse whitespace → separator

  // slugify('Café au Lait')      → "cafe-au-lait"
  // slugify('Hello World', '_')  → "hello_world"
}

// Node.js alternative using the `slugify` npm package:
// npm install slugify
// const slugify = require('slugify')
// slugify('Hello World', { lower: true, strict: true }) → "hello-world"
Python
import re
import unicodedata

def slugify(text: str, separator: str = '-') -> str:
    """Convert text to a URL-safe slug."""
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore').decode('ascii')  # strip non-ASCII
    text = text.lower()
    text = re.sub(r'[^\w\s-]', ' ', text)
    text = text.strip()
    text = re.sub(r'[\s_-]+', separator, text)
    return text

# slugify('Café au Lait')      → "cafe-au-lait"
# slugify('Hello World', '_')  → "hello_world"

# Alternative: python-slugify (pip install python-slugify)
# from slugify import slugify
# slugify('Café au Lait')  → "cafe-au-lait"
Go
package main

import (
	"regexp"
	"strings"
	"unicode"

	"golang.org/x/text/unicode/norm"
	"golang.org/x/text/transform"
	"golang.org/x/text/runes"
)

func slugify(text string) string {
	// NFD normalize and strip diacritics
	t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC)
	result, _, _ := transform.String(t, text)

	result = strings.ToLower(result)
	re := regexp.MustCompile(`[^\w\s-]+`)
	result = re.ReplaceAllString(result, " ")
	result = strings.TrimSpace(result)
	re = regexp.MustCompile(`[\s_-]+`)
	result = re.ReplaceAllString(result, "-")
	return result
}

// slugify("Café au Lait") → "cafe-au-lait"
// slugify("Hello World")  → "hello-world"
PHP
function slugify(string $text, string $separator = '-'): string {
    // Transliterate non-ASCII characters
    $text = transliterator_transliterate(
        'Any-Latin; Latin-ASCII; Lower()', $text
    );
    // Remove anything that is not a word char, space, or hyphen
    $text = preg_replace('/[^\w\s-]/', ' ', $text);
    $text = trim($text);
    $text = preg_replace('/[\s_-]+/', $separator, $text);
    return $text;
}

// slugify('Café au Lait')      → "cafe-au-lait"
// slugify('Hello World', '_')  → "hello_world"

Câu hỏi thường gặp

Sự khác biệt giữa slug và đường dẫn URL là gì?
Đường dẫn URL là toàn bộ đoạn sau tên miền, như /blog/2026/my-post. Slug là phần dễ đọc xác định một tài nguyên cụ thể trong đường dẫn đó, thường là đoạn cuối cùng: my-post. Slug thường được tạo ra từ tiêu đề, trong khi phần còn lại của đường dẫn phản ánh cấu trúc định tuyến của trang web.
Tạo slug xử lý các chữ viết không thuộc Latin như tiếng Trung hoặc tiếng Ả Rập như thế nào?
Các trình tạo slug tiêu chuẩn sử dụng chuẩn hóa NFD và loại bỏ dấu phụ không thể phiên âm các chữ viết không thuộc Latin. Các ký tự như chữ Hán của tiếng Trung hoặc chữ cái Ả Rập không có tương đương ASCII, vì vậy chúng bị loại bỏ trong bước dọn dẹp ký tự đặc biệt. Để giữ lại nội dung không thuộc Latin trong slug, bạn cần thư viện phiên âm như limax (JavaScript), python-slugify với backend unidecode, hoặc bảng ánh xạ tùy chỉnh.
Tôi nên dùng dấu gạch ngang hay gạch dưới trong slug URL?
Google xử lý dấu gạch ngang như ký tự phân cách từ nhưng xử lý gạch dưới như ký tự nối từ. Slug my-first-post được đọc là ba từ (my, first, post), trong khi my_first_post được đọc là một chuỗi. Đối với mục đích SEO, dấu gạch ngang là lựa chọn tiêu chuẩn cho slug URL. Gạch dưới phổ biến trong tên tệp, cột cơ sở dữ liệu, và mã định danh lập trình nơi chúng đóng vai trò kết nối an toàn với biến.
Độ dài của slug URL nên là bao nhiêu?
Google hiển thị khoảng 60 ký tự của URL trong kết quả tìm kiếm trước khi cắt ngắn. Slug ngắn hơn dễ đọc, chia sẻ, và gõ hơn. Hướng tới 3 đến 6 từ. Loại bỏ các từ dừng (the, a, an, and, or, in) khi chúng không thay đổi ý nghĩa: how-to-build-nextjs-app tốt hơn how-to-build-a-next-js-app-in-2026.
Tạo slug có giống với mã hóa URL không?
Không. Mã hóa URL (percent-encoding) thay thế các ký tự không an toàn bằng bộ ba ký hiệu phần trăm như %20 cho khoảng trắng. Tạo slug loại bỏ hoặc thay thế hoàn toàn các ký tự không an toàn, tạo ra một chuỗi sạch không có dấu hiệu mã hóa. Slug không bao giờ chứa dấu phần trăm, khoảng trắng, hoặc ký tự đặc biệt. Mã hóa URL bảo tồn nội dung gốc; tạo slug biến đổi nó thành thứ gì đó mới.
Hai tiêu đề khác nhau có thể tạo ra cùng một slug không?
Có. Các tiêu đề chỉ khác nhau về dấu câu, dấu nhấn, hoặc kiểu chữ thường xuyên thu gọn thành cùng một slug. Ví dụ, Résumé Tips và Resume Tips đều tạo ra resume-tips. Trong ngữ cảnh CMS hoặc cơ sở dữ liệu, bạn cần kiểm tra tính duy nhất để thêm hậu tố số (resume-tips-2) khi xảy ra xung đột.
Làm thế nào để tạo slug trong WordPress hoặc Django?
WordPress tự động tạo slug từ tiêu đề bài viết bằng hàm sanitize_title(). Bạn có thể chỉnh sửa slug trong trình soạn thảo bài viết. Django cung cấp hàm slugify() trong django.utils.text, xử lý đầu vào ASCII tốt. Để hỗ trợ Unicode, truyền allow_unicode=True. Cả hai nền tảng đều lưu trữ slug trong cơ sở dữ liệu cùng với tiêu đề đầy đủ.