用纯 bash 创建 URL 友好的 slug?

Posted

技术标签:

【中文标题】用纯 bash 创建 URL 友好的 slug?【英文标题】:Create URL friendly slug with pure bash? 【发布时间】:2018-04-13 12:26:52 【问题描述】:

我追求的是一个纯粹的 bash 解决方案来“slugify”一个变量,它不像我的那么难看。

slugify:小写,缩短为 63 字节,除了 0-9 和 a-z 替换为 -。没有前导/尾随 -。结果是一个适合在 URL 主机名和域名中使用的字符串。 输入很可能是一系列带有不想要的字符的单词,例如:

'Effrafax_mUKwT'uP7(Garkbitg@'k'

蛞蝓看起来像: 'effrafax-mukwt-up7-garkbit-1-njrjhactar-s-h-x-olazlarl-zss-c9-q'

slugify () 
  next=$1//+([^A-Za-z0-9])/-
  next=$next:0:63
  next=$next,,
  next=$next#-
  next=$next%-
  echo $next

还有为什么$next//^-|-$ 不去掉前缀和后缀'-'?其他建议?

【问题讨论】:

你能提供一个这样的示例 URL 来测试吗? 发布输入条目和预期输出将增加您获得快速帮助的机会 【参考方案1】:

answer above 的 OS X 和 linux 兼容变体

slugify () 
    echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/[~^]+//g' | sed -E 's/[^a-zA-Z0-9]+/-/g' | sed -E 's/^-+|-+$//g' | tr A-Z a-z

【讨论】:

请记住,您可以组合多个 sed 语句,如下所示:【参考方案2】:

我在我的 bash 个人资料中使用了这个功能:

slugify () 
    echo "$1" | iconv -t ascii//TRANSLIT | sed -r s/[~\^]+//g | sed -r s/[^a-zA-Z0-9]+/-/g | sed -r s/^-+\|-+$//g | tr A-Z a-z

基于:https://gist.github.com/oneohthree/f528c7ae1e701ad990e6

【讨论】:

效果很好!将-c 添加到iconv 以静默丢弃无法转换的字符。 ss64.com/bash/iconv.html

以上是关于用纯 bash 创建 URL 友好的 slug?的主要内容,如果未能解决你的问题,请参考以下文章

生成 SEO 友好的 URL(slug)的最成熟的方式/lib 是啥?

Codeigniter - SEO 友好的 URL 结构(Slug 实现)

PHP 获取slug(URL友好字符串)

Get slug(URL友好字符串)

.htaccess 多语言(slug URL/友好 URL)[关闭]

Rails 4中友好id gem的随机slug url