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

标签 java regex seo url-rewriting slug

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

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

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

一个微不足道的 slug 函数应该是这样的:

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

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

我的问题:

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

最佳答案

Normalize您的字符串使用规范分解:

  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 字符。

关于用于生成 slug 的 Java 代码/库(用于漂亮的 URL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1657193/

相关文章:

c++ - C++中的前缀匹配

asp.net-mvc - 以 "/"开头的 anchor 的 asp.net mvc url 错误?

Java使用URL类获取html源的安全风险

java - java arraylist中的数字按升序排序

java - Java 中的对象通信,没有带有 getter 和 setter 的静态变量

java - 从抽象类和子类java创建对象数组

python - django 的 url 正则表达式如何工作

regex - 行尾如何影响这里的正则表达式?

.htaccess 重定向不起作用/托管自动重定向到定义的页面

seo - 子域好还是子文件夹好?