小编典典

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

java

诸如Rails和Django之类的Web框架内置了对“子弹”的支持,“子弹”用于生成可读且对SEO友好的URL:

团状串典型地只包含的字符a-z0-9-且可因此在不URL转义(认为“富%20巴”)编写的。

我在寻找一个Java蛞蝓函数给出任何有效的Unicode字符串将返回蛞蝓表示(a-z0-9-)。

一个普通的子弹函数可能类似于:

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

但是,此实现无法处理国际化和重音符号(ë> e)。解决此问题的一种方法是枚举所有特殊情况,但这并不是很好。我在寻找一些经过深思熟虑的方法。

我的问题:

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

阅读 223

收藏
2020-10-07

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

2020-10-07