如何在C#中生成一个友好的URL?
时间:2020-03-05 18:45:56 来源:igfitidea点击:
我该如何在C#中生成一个友好的URL?目前,我简单地用下划线替换空格,但是如何生成类似于Stack Overflow的URL?
例如,如何转换:
How do I generate a Friendly URL in C#?
进入
how-do-i-generate-a-friendly-url-in-C
解决方案
回答
这是我们的方法。请注意,边缘条件可能比我们乍看之下要多。
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, "-")
但是,它确实为我们提供了以"-"结尾的字符串。因此,也许要使用第二个正则表达式来从字符串的开头/结尾修剪掉这些正则表达式,并可能将任何内部的"-"替换为"-"。
回答
但是,在Jeff的解决方案中有几处可以改进。
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;
请注意,只要有可能,此方法将使用字符串函数而不是正则表达式函数,并使用char函数而不是字符串函数。