44

Rails や Django などの Web フレームワークには、読み取り可能で SEO に適した URL を生成するために使用される「スラッグ」のサポートが組み込まれています。

通常、スラッグ文字列には の文字のみが含まれるためa-z、 URL エスケープなし0-9-記述できます (「foo%20bar」と考えてください)。

a-z指定された有効な Unicode 文字列がスラッグ表現 ( 、0-9および)を返す Java スラッグ関数を探しています-

些細なスラッグ関数は、次のようなものになります。

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

ëただし、この実装では国際化とアクセント ( > )は処理されませんe。これを回避する 1 つの方法は、すべての特殊なケースを列挙することですが、それはあまりエレガントではありません。もっとよく考えられた一般的なものを探しています。

私の質問:

  • JavaでDjango/Railsタイプのスラッグを生成する最も一般的/実用的な方法は何ですか?
4

4 に答える 4

53

正規分解を使用して文字列を正規化します。

  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+ 0049 ( I ) ではなく U +0130 ( İ ) であるため、トルコ語ロケールで使用する場合、非 latin1 文字を文字列に戻すリスクがあります。String.toLowerCase()

于 2009-11-01T14:08:58.813 に答える
16

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

コードとその使用法を確認するためのGitHubリポジトリは次のとおりです。

https://github.com/slugify/slugify

于 2012-07-17T17:42:32.567 に答える
5

@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("^-|-$","");
  }
于 2015-11-20T16:21:11.153 に答える