我正在做一个有文章的网站,我需要文章有“友好”的url,基于标题。
例如,如果我的文章标题是“文章测试”,我希望URL是http://www.example.com/articles/article_test。
但是,文章标题(与任何字符串一样)可以包含多个特殊字符,这些字符不可能直接放在我的URL中。比如说,我知道?或#需要被替换,但我不知道所有其他。
url中允许使用哪些字符?什么东西是安全的?
我正在做一个有文章的网站,我需要文章有“友好”的url,基于标题。
例如,如果我的文章标题是“文章测试”,我希望URL是http://www.example.com/articles/article_test。
但是,文章标题(与任何字符串一样)可以包含多个特殊字符,这些字符不可能直接放在我的URL中。比如说,我知道?或#需要被替换,但我不知道所有其他。
url中允许使用哪些字符?什么东西是安全的?
当前回答
引用RFC 3986第2.3节:
URI中允许的但没有保留的字符 目的,都叫无保留。这包括大写和小写 字母、十进制数字、连字符、句号、下划线和波浪号。 字母数字"-" / "。"/ "_" / "~"
注意,RFC 3986比旧的RFC 2396列出了更少的保留标点符号。
其他回答
从你所描述的上下文来看,我怀疑你实际上想要做的是一种叫做“SEO slug”的东西。最常见的做法是:
转换为小写 将除a-z和0-9之外的整个字符序列转换为一个连字符(-)(不是下划线) 从URL中删除“停止词”,即“a”、“an”和“the”等无意义的可索引词;谷歌用于广泛列表的“停止词”
举个例子,一篇名为“漫画中使用!@%$*来表示脏话”的文章会出现“用法-表示-脏话-漫画”。
引用RFC 3986第2.3节:
URI中允许的但没有保留的字符 目的,都叫无保留。这包括大写和小写 字母、十进制数字、连字符、句号、下划线和波浪号。 字母数字"-" / "。"/ "_" / "~"
注意,RFC 3986比旧的RFC 2396列出了更少的保留标点符号。
您需要注意两组字符:保留字符和不安全字符。
保留字符为:
&(“&”) 美元(美元) 加号(“+”) 逗号(,) 正斜杠("/") 冒号(“:”) 分号(“;”) = (" = ") 问号(“?”) “At”符号(“@”) 英镑(“#”)。
一般认为不安全的字符有:
空格(" ") 小于大于("<>") 左右括号("[]") 前后大括号("{}") 管(“|”) 反斜杠(\) 插入符号(“^”) 百分比(%)
我可能忘记了一个或多个,这导致我重复卡尔V的答案。从长远来看,您最好使用允许字符的“白名单”,然后对字符串进行编码,而不是试图与服务器和系统不允许的字符保持一致。
从SEO的角度来看,连字符比下划线更受欢迎。转换为小写,删除所有撇号,然后用一个连字符替换所有非字母数字字符字符串。修剪多余的连字符从开始和结束。
我也遇到过类似的问题。我想拥有漂亮的url,并得出结论,我必须只允许字母,数字,-和_在url中。
这很好,但后来我写了一些漂亮的正则表达式,我意识到它识别所有UTF-8字符不是。net中的字母,这是搞砸了。对于. net正则表达式引擎来说,这似乎是一个众所周知的问题。所以我得到了这个解决方案:
private static string GetTitleForUrlDisplay(string title)
{
if (!string.IsNullOrEmpty(title))
{
return Regex.Replace(Regex.Replace(title, @"[^A-Za-z0-9_-]", new MatchEvaluator(CharacterTester)).Replace(' ', '-').TrimStart('-').TrimEnd('-'), "[-]+", "-").ToLower();
}
return string.Empty;
}
/// <summary>
/// All characters that do not match the patter, will get to this method, i.e. useful for Unicode characters, because
/// .NET implementation of regex do not handle Unicode characters. So we use char.IsLetterOrDigit() which works nicely and we
/// return what we approve and return - for everything else.
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static string CharacterTester(Match m)
{
string x = m.ToString();
if (x.Length > 0 && char.IsLetterOrDigit(x[0]))
{
return x.ToLower();
}
else
{
return "-";
}
}