如何在 C# 中生成友好 URL?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37809/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 09:44:59  来源:igfitidea点击:

How do I generate a Friendly URL in C#?

提问by GateKiller

How can I go about generating a Friendly URL in C#? Currently I simple replace spaces with an underscore, but how would I go about generating URL's like Stack Overflow?

如何在 C# 中生成友好 URL?目前我简单地用下划线替换空格,但是我将如何生成像 Stack Overflow 这样的 URL?

For example how can I convert:

例如,我如何转换:

How do I generate a Friendly URL in C#?

如何在 C# 中生成友好 URL?

Into

进入

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

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

采纳答案by Konrad Rudolph

There are several things that could be improved in Jeff's solution, though.

不过,Jeff 的解决方案中有几项可以改进。

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

IMHO, not the place to test this. If the function gets passed an empty string, something went seriously wrong anyway. Throw an error or don't react at all.

恕我直言,不是测试这个的地方。如果该函数传递了一个空字符串,那么无论如何都会出现严重错误。抛出错误或根本不做出反应。

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

Twice the work. Considering that each operation creates a whole new string, this is bad, even if performance is not an issue.

两倍的工作。考虑到每个操作都会创建一个全新的字符串,这很糟糕,即使性能不是问题。

// 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,}", "-");

Again, basically twice the work: First, use regex to replace multiple spaces at once. Then, use regex again to replace multiple dashes at once. Two expressions to parse, two automata to construct in memory, iterate twice over the string, create two strings: All these operations can be collapsed to a single one.

同样,基本上是两倍的工作:首先,使用正则表达式一次替换多个空格。然后,再次使用正则表达式一次替换多个破折号。要解析的两个表达式,要在内存中构造的两个自动机,在字符串上迭代两次,创建两个字符串:所有这些操作都可以折叠为一个。

Off the top of my head, without any testing whatsoever, this would be an equivalent solution:

在我的脑海里,没有任何测试,这将是一个等效的解决方案:

// 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;

Notice that this method uses string functions instead of regex functions and char functions instead of string functions whenever possible.

请注意,此方法尽可能使用字符串函数而不是正则表达式函数和字符函数而不是字符串函数。

回答by Jeff Atwood

Here's how we do it. Note that there are probably more edge conditions than you realize at first glance..

这是我们如何做到的。请注意,边缘条件可能比您乍一看意识到的要多。

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;

回答by Matt Hamilton

This gets part of the way there (using a whitelist of valid characters):

这在那里得到了一部分(使用有效字符的白名单):

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

It does, however, give you a string that ends with "--". So perhaps a second regex to trim those from the beginning/end of the string, and maybe replace any internal "--" to "-".

但是,它确实为您提供了一个以“--”结尾的字符串。所以也许第二个正则表达式从字符串的开头/结尾修剪那些,并且可能将任何内部“--”替换为“-”。

回答by Arslan Ali

here is a simple function which can convert your string to Url, you just need to pass title or string it will convert it to user friendly Url.

这是一个简单的函数,可以将您的字符串转换为 Url,您只需要传递标题或字符串,它就会将其转换为用户友好的 Url。

    public static string GenerateUrl(string Url)
    {
        string UrlPeplaceSpecialWords = Regex.Replace(Url, @""|['"",&?%\.!()@$^_+=*:#/\-]", " ").Trim();
        string RemoveMutipleSpaces = Regex.Replace(UrlPeplaceSpecialWords, @"\s+", " ");
        string ReplaceDashes = RemoveMutipleSpaces.Replace(" ", "-");
        string DuplicateDashesRemove = ReplaceDashes.Replace("--", "-");
        return DuplicateDashesRemove.ToLower();
    }