将标题转换为虚线URL友好字符串

Rob*_*nik 19 c# replace

我想编写一个C#方法,将任何标题转换为URL友好字符串,类似于stackoverflow的作用:

  • 用破折号替换空格
  • 删除括号
  • 等等

我正在考虑按照RFC 3986标准(来自维基百科)删除保留字符,但我不知道这是否足够?它会使链接可行,但有没有人知道堆栈溢出这里有什么其他字符被替换?我不希望在我的网址中以%-s结尾...

目前的实施

string result = Regex.Replace(value.Trim(), @"[!*'""`();:@&+=$,/\\?%#\[\]<>«»{}_]");
return Regex.Replace(result.Trim(), @"[\s*[\-–—\s]\s*]", "-");
Run Code Online (Sandbox Code Playgroud)

我的问题

  1. 我应该删除哪些字符?
  2. 我应该限制结果字符串的最大长度吗?
  3. 任何人都知道哪些规则适用于SO上的标题?

一个子问题
我是否应该将此问题转移到元,即使它与编程相关?

T.J*_*der 38

没有寻找要替换的东西,而不是未预留的字符列表是如此之短,它将成为一个很好的清晰正则表达式.

return Regex.Replace(value, @"[^A-Za-z0-9_\.~]+", "-");
Run Code Online (Sandbox Code Playgroud)

(请注意,我没有在允许的字符列表中包含短划线;因此它被"1或更多"运算符[ +] 吞噬,以便折叠多个破折号(原始或生成或组合中),根据多米尼克罗杰的优点.)

您可能还想删除常用词("the","an","a"等),尽管这样做可能会略微改变句子的含义.可能还想删除任何尾随破折号和句号.

此外强烈建议你做什么,所以和别人做的,包括一个唯一的标识符其他比标题,然后只处理URL时使用该唯一的ID.所以http://example.com/articles/1234567/is-the-pop-catholic(注意缺少'e')并http://example.com/articles/1234567/is-the-pope-catholic解析为相同的资源.