텍스트 Slugify (URL)
텍스트를 URL에 친화적인 slug로 정규화합니다. 소문자 변환, 구분자 지정, 사용자 정의 불용어 제거를 지원합니다.
왜 Slugify가 필요한가요?
🔍 SEO 최적화
URL 내 키워드는 검색 엔진이 페이지 내용을 이해하고 순위를 높이는 데 도움이 됩니다. 예: example.com/blog/how-to-learn-javascript 는 example.com/blog/123 보다 더 친화적입니다.
👁️ 가독성 및 공유
사용자는 URL만 보고도 콘텐츠를 바로 파악할 수 있으며, 소셜 미디어 공유 시 더 친화적이고 기억하기 쉽고 수동 입력도 편리합니다.
💻 시스템 호환성
특수 문자로 인한 파일명/URL 오류를 방지하고, Windows/Linux/Mac 등 다양한 플랫폼에서 호환되며 인코딩 문제를 피합니다.
🗄️ 데이터베이스 친화적
사용자명, 태그 등 고유 식별자로 사용 시 SQL 인젝션 리스크를 줄이고, 인덱싱 및 쿼리가 용이합니다.
자주 묻는 질문
Q: 중국어 문자는 어떻게 처리되나요?
A: 기본적으로 음표는 제거되고 핑inyin 문자만 유지됩니다. 완전한 중국어는 빈 문자열이 될 수 있으므로, slugify 전에 먼저 수동으로 핑inyin으로 변환하거나 중국어 핑inyin 변환 도구를 사용하는 것을 권장합니다.
Q: 결과가 비어 있는 이유는 무엇인가요?
A: 입력된 내용이 모두 문장 부호/기호/공백일 수 있으며, 정지어 필터링을 활성화한 후 남은 단어가 없을 수도 있습니다. 정지어 옵션을 비활성화하거나 입력 내용을 조정해 보세요.
Q: 구분자로 - 와 _ 중 어떤 것을 사용해야 하나요?
A: SEO 관점에서는 - (하이픈)을 사용하는 것이 좋습니다. Google은 이를 공백으로 인식하지만, _ (밑줄)은 연결 기호로 인식되어 단어 분리에 불리합니다. 파일명의 경우 어느 것을 사용해도 상관없습니다.
Q: Slug의 길이에 제한이 있나요?
A: 기술적으로 제한은 없지만, URL 표시 및 SEO를 위해 50자 이내로 유지하는 것이 좋습니다. 너무 긴 slug는 검색 엔진에 의해 자르힐 수 있습니다.
기술 설명
NFKD 분해 + 조합 음표(\p{M}) 제거를 사용하여 Café를 Cafe로 변환합니다. 대부분의 라틴어 계열 문자를 지원합니다.
영어 일반 단어(a/an/the/and/or/of/to/in/on/for/at/by/with) 기반으로 구성되며, 사용자가 확장할 수 있습니다. 중국어 정지어는 별도 처리가 필요합니다.
ES6+ 및 유니코드 정규식(\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("^-+|-+$", "");
}