我想编写一个 C# 方法,将任何标题转换为 URL 友好字符串,类似于 Stack Overflow 所做的:
我正在考虑根据 RFC 3986 标准(来自 Wikipedia )删除保留字符,但我不知道这是否足够?它会使链接可用,但有谁知道在 stackoverflow 上替换了哪些其他字符?我不想在我的 URL 中以 %-s 结尾...
当前实现
string result = Regex.Replace(value.Trim(), @"[!*'""`();:@&+=$,/\\?%#\[\]<>«»{}_]");
return Regex.Replace(result.Trim(), @"[\s*[\-–—\s]\s*]", "-");
我的问题
- 我应该删除哪些字符?
- 我应该限制结果字符串的最大长度吗?
- 有人知道 SO 上的标题适用哪些规则吗?
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
解析为同一资源。