跳到正文

工作收集/正则处理

GitHub

SEO slug 正则清洗

正则SEO字符串

场景

真实项目里经常要把文章标题、商品标题或页面标题转成 URL 里的 slug,需要保证结果短、稳定、可读,并且不会带奇怪符号。

代码

function normalizeSeoSlug(value: string): string {
  return value
    .trim()
    .toLowerCase()
    .replace(/[`'"“”‘’]/g, '')
    .replace(/&/g, ' and ')
    .replace(/[^a-z0-9\s-]/g, ' ')
    .replace(/\s+/g, ' ')
    .split(/[\s-]+/)
    .filter(Boolean)
    .slice(0, 5)
    .join('-')
    .replace(/-+/g, '-')
    .replace(/^-|-$/g, '');
}

记一下

这类正则不要一次写成一个巨大的表达式,真实项目里更适合拆成一条清洗流水线:

  • /['"“”‘’]/g`:去掉中英文引号,避免标题里的 quote 变成无意义字符。
  • /&/g:把 & 转成 and,比直接删掉更可读。
  • /[^a-z0-9\s-]/g:只保留英文小写、数字、空白和短横线,其他符号先变成空格。
  • /\s+/g:把连续空白压成一个空格,避免后面 split 出空 token。
  • /[\s-]+/:按空白或短横线切词,兼容原始标题里已经带 - 的情况。
  • /-+/g:兜底合并连续短横线。
  • /^-|-$/g:去掉首尾短横线,避免生成 /foo-/ 或 /-foo/。

关键点是顺序:先清洗符号,再切词限长,最后统一 join 和兜底 trim。这样每一步都能解释,也方便以后按业务规则调整。