28

C# でフレンドリー URL を生成するにはどうすればよいですか? 現在、スペースをアンダースコアに置き換えるだけですが、Stack Overflow のような URL を生成するにはどうすればよいですか?

たとえば、どのように変換できますか:

C# でフレンドリー URL を生成するにはどうすればよいですか?

の中へ

How-do-i-generate-a-friendly-url-in-C

4

4 に答える 4

47

ただし、Jeff のソリューションには改善できる点がいくつかあります。

if (String.IsNullOrEmpty(title)) return "";

私見、これをテストする場所ではありません。関数に空の文字列が渡された場合は、とにかく何か重大な問題が発生しています。エラーをスローするか、まったく反応しません。

// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one

2倍の仕事。各操作がまったく新しい文字列を作成することを考えると、パフォーマンスが問題にならなかったとしても、これは悪いことです。

// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");

繰り返しますが、基本的に 2 倍の作業です。まず、正規表現を使用して複数のスペースを一度に置き換えます。次に、もう一度正規表現を使用して複数のダッシュを一度に置き換えます。解析する 2 つの式、メモリ内に構築する 2 つのオートマトン、文字列を 2 回反復し、2 つの文字列を作成します。これらの操作はすべて 1 つの操作に折りたたむことができます。

私の頭の上から、何のテストもなしに、これは同等の解決策になるでしょう:

// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;

このメソッドでは、可能な限り、正規表現関数の代わりに文字列関数を使用し、文字列関数の代わりに char 関数を使用することに注意してください。

于 2008-09-01T12:35:51.173 に答える
18

これが私たちのやり方です。一見したよりも多くのエッジ条件が存在することに注意してください。

if (String.IsNullOrEmpty(title)) return "";

// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", "");
// remove any leading or trailing spaces left over
title = title.Trim();
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash            
title = Regex.Replace(title, @"\-{2,}", "-");
// make it all lower case
title = title.ToLower();
// if it's too long, clip it
if (title.Length > 80)
    title = title.Substring(0, 79);
// remove trailing dash, if there is one
if (title.EndsWith("-"))
    title = title.Substring(0, title.Length - 1);
return title;
于 2008-09-01T12:03:30.520 に答える
5

これは、その方法の一部を取得します (有効な文字のホワイトリストを使用):

new Regex("[^a-zA-Z-_]").Replace(s, "-")

ただし、「--」で終わる文字列は返されます。したがって、おそらく文字列の最初/最後からそれらをトリミングし、内部の「--」を「-」に置き換えるための2番目の正規表現。

于 2008-09-01T12:03:58.287 に答える