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

例如我如何转换:

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

进入

如何在 C 中生成友好的 url

有帮助吗?

解决方案

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

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

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

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

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

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

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

其他提示

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

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;

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top