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

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

How do I generate a Friendly URL in C#?

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

例如,如何转换:

How do I generate a Friendly URL in C#?

进入

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


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

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

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

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

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

1
2
3
4
// 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,}","-");

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

我不需任何测试就可以解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 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函数而不是字符串函数。


这是我们的方法。请注意,边缘条件可能比您乍看之下要多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;


这是其中的一部分(使用有效字符的白名单):

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

但是,它确实为您提供了以"-"结尾的字符串。因此,也许要使用第二个正则表达式来从字符串的开头/结尾修剪掉它们,并可能将任何内部的"-"替换为"-"。


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

1
2
3
4
5
6
7
8
    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();
    }


推荐阅读