用于生成slug的java代码/库(用于漂亮的url)

euoag5mw  于 2021-07-05  发布在  Java
关注(0)|答案(5)|浏览(485)

rails和django等web框架内置了对“slug”的支持,用于生成可读的和seo友好的URL:
铁轨上的弹头
django的鼻涕虫
段塞字符串通常只包含 a-z , 0-9 以及 - 因此可以在没有url转义的情况下编写(比如“foo%20bar”)。
我正在寻找一个java slug函数,给定任何有效的unicode字符串都将返回slug表示( a-z , 0-9 以及 - ).
一个简单的slug函数可以是:

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

但是,这个实现不会处理国际化和重音( ë > e ). 解决这个问题的一种方法是列举所有的特殊情况,但这并不是很优雅。我在找一个更周密和全面的。
我的问题是:

在java中生成django/rails类型slug最通用/实用的方法是什么

sdnqo3pr

sdnqo3pr1#

麦克道尔的主张几乎奏效,但在这样的情况下 Hello World !! 它回来了 hello-world-- (注意 -- 在字符串的末尾)而不是 hello-world .
固定版本可以是:

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

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

tct7dpnv2#

我用@mcdowell扩展了答案,将转义标点作为连字符,并删除了重复的和前导/尾随的连字符。

private static final Pattern NONLATIN = Pattern.compile("[^\\w_-]");  
  private static final Pattern SEPARATORS = Pattern.compile("[\\s\\p{Punct}&&[^-]]");  

  public static String makeSlug(String input) {  
    String noseparators = SEPARATORS.matcher(input).replaceAll("-");
    String normalized = Normalizer.normalize(noseparators, Form.NFD);
    String slug = NONLATIN.matcher(normalized).replaceAll("");
    return slug.toLowerCase(Locale.ENGLISH).replaceAll("-{2,}","-").replaceAll("^-|-$","");
  }
a5g8bdjr

a5g8bdjr3#

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

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(i)̇), 不是u+0049(i),所以如果使用 String.toLowerCase() 在土耳其的地方。

xdyibdwo

xdyibdwo4#

其他语言参考库:http://www.codecodex.com/wiki/generate_a_url_slug

ki0zmccv

ki0zmccv5#

http://search.maven.org/#search|ga | 1 |缓动
下面是github存储库,可以查看代码及其用法:
https://github.com/slugify/slugify

相关问题