用于生成 slug 的 Java 代码/库(用于漂亮的 URL)

2022-08-31 23:56:36

Rails和Django等Web框架内置了对“slugs”的支持,这些“slugs”用于生成可读且SEO友好的URL:

slug字符串通常只包含字符,因此可以在没有URL转义的情况下编写(想想“foo%20bar”)。a-z0-9-

我正在寻找一个Java slug函数,给定任何有效的Unicode字符串将返回一个slug表示(和)。a-z0-9-

一个简单的 slug 函数将类似于以下内容:

return input.toLowerCase().replaceAll("[^a-z0-9-]", "");

但是,此实现不会处理国际化和重音符号(>)。解决这个问题的一种方法是列举所有特殊情况,但这不会很优雅。我正在寻找一些更深思熟虑和一般的东西。ëe

我的问题:

  • 在Java中生成Django /Rails类型slugs的最通用/最实用的方法是什么?

答案 1

使用规范分解规范化字符串:

  private static final Pattern NONLATIN = Pattern.compile("[^\\w-]");
  private static final Pattern WHITESPACE = Pattern.compile("[\\s]");

  public static String toSlug(String input) {
    String nowhitespace = WHITESPACE.matcher(input).replaceAll("-");
    String normalized = Normalizer.normalize(nowhitespace, Form.NFD);
    String slug = NONLATIN.matcher(normalized).replaceAll("");
    return slug.toLowerCase(Locale.ENGLISH);
  }

不过,这仍然是一个相当幼稚的过程。它不会对s-sharp(ß - 在德语中使用)或任何非拉丁语字母(希腊语,西里尔文,CJK等)做任何事情。

更改字符串的大小写时要小心。大写和小写形式取决于字母表。在土耳其语中,U+0069 (i) 的大小写是 U+0130 (İ),而不是 U+0049 (I),因此,如果在土耳其语区域设置下使用 String.toLowerCase(),则可能会将非 latin1 字符重新引入字符串。


答案 2

http://search.maven.org/#search|ga|1|lugify

下面是 GitHub 存储库,用于查看代码及其用法:

https://github.com/slugify/slugify