我想编写一个C#方法,将任何标题转换为URL友好字符串,类似于stackoverflow的作用:
我正在考虑按照RFC 3986标准(来自Wikipedia)删除保留字符,但我不知道这是否足够?这会使链接变得可行,但是有人知道堆栈溢出时其他字符被替换了吗?我不希望在我的网址中以%-s结尾......
string result = Regex.Replace(value.Trim(), @"[!*'""`();:@&+=$,/\\?%#\[\]<>«»{}_]");
return Regex.Replace(result.Trim(), @"[\s*[\-–—\s]\s*]", "-");
子问题
我是否应该将此问题移至元,即使它与编程有关?
答案 0 :(得分:38)
而不是寻找要替换的内容,而不是unreserved chars is so short的列表,它将为明确的正则表达式做准备。
return Regex.Replace(value, @"[^A-Za-z0-9_\.~]+", "-");
(请注意,我没有在允许的字符列表中包含短划线;因此它被“1个或更多”运算符[+
]吞噬,以便多个破折号(在原始或根据Dominic Rodger的优点,生成或组合崩溃了。)
您可能还想删除常用词(“the”,“an”,“a”等),但这样做可能会略微改变句子的含义。可能还想删除任何尾随破折号和句号。
还强烈建议您执行SO和其他人所做的操作,并在标题之外添加唯一标识符其他,然后在处理URL时仅使用该唯一ID。所以http://example.com/articles/1234567/is-the-pop-catholic
(注意缺少的'e')和http://example.com/articles/1234567/is-the-pope-catholic
解析为同一资源。
答案 1 :(得分:2)
我会这样做:
string url = title;
url = Regex.Replace(url, @"^\W+|\W+$", "");
url = Regex.Replace(url, @"'\"", "");
url = Regex.Replace(url, @"_", "-");
url = Regex.Replace(url, @"\W+", "-");
基本上这是做什么的:
答案 2 :(得分:1)
大多数“sluggifiers”(转换为friendly-url类型名称的方法)倾向于执行以下操作:
据我所知,StackOverflow的缓冲器执行#1,#3和#4,但不执行#2。
答案 3 :(得分:1)
这个怎么样:
string FriendlyURLTitle(string pTitle)
{
pTitle = pTitle.Replace(" ", "-");
pTitle = HttpUtility.UrlEncode(pTitle);
return Regex.Replace(pTitle, "\%[0-9A-Fa-f]{2}", "");
}
答案 4 :(得分:1)
这就是我目前的说法。
public static string Slug(this string value)
{
if (value.HasValue())
{
var builder = new StringBuilder();
var slug = value.Trim().ToLowerInvariant();
foreach (var c in slug)
{
switch (c)
{
case ' ':
builder.Append("-");
break;
case '&':
builder.Append("and");
break;
default:
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') && c != '-')
{
builder.Append(c);
}
break;
}
}
return builder.ToString();
}
return string.Empty;
}
答案 5 :(得分:0)
我用这个......
public static string ToUrlFriendlyString(this string value)
{
value = (value ?? "").Trim().ToLower();
var url = new StringBuilder();
foreach (char ch in value)
{
switch (ch)
{
case ' ':
url.Append('-');
break;
default:
url.Append(Regex.Replace(ch.ToString(), @"[^A-Za-z0-9'()\*\\+_~\:\/\?\-\.,;=#\[\]@!$&]", ""));
break;
}
}
return url.ToString();
}
答案 6 :(得分:0)
这对我有用
string output = Uri.UnescapeDataString(input);