C# 要在SEO清理Uri中删除的字符

C# 要在SEO清理Uri中删除的字符,c#,asp.net,seo,uri,C#,Asp.net,Seo,Uri,我正在使用asp.net/C,我正在为我正在创建的一个小型CMS系统创建独特的(?)URI 我正在从我的文章标题生成uri段,因此,例如,如果标题是“我的精彩文章”,则uri将是www.website.com/news/my-ascheng-article 这有两个部分。首先,你认为我需要去掉哪些角色?我用“-”替换空格,我想我也应该去掉“/”字符。你能想出更多可能引起问题的办法吗?“?”也许?我应该删除所有非字母字符吗 第二个问题,上面我提到的URI可能需要是唯一的。我打算在添加之前检查uri

我正在使用asp.net/C,我正在为我正在创建的一个小型CMS系统创建独特的(?)URI

我正在从我的文章标题生成uri段,因此,例如,如果标题是“我的精彩文章”,则uri将是www.website.com/news/my-ascheng-article

这有两个部分。首先,你认为我需要去掉哪些角色?我用“-”替换空格,我想我也应该去掉“/”字符。你能想出更多可能引起问题的办法吗?“?”也许?我应该删除所有非字母字符吗


第二个问题,上面我提到的URI可能需要是唯一的。我打算在添加之前检查uri列表以确保唯一性,但是我看到堆栈溢出使用了一个数字加上一个uri。我假设这允许标题被复制?你认为这是更好的方法吗

将所有的变音符号转换为它们的基本字符,然后使用
Char.isleterordigit
去除任何不是字母或数字的字符

然后用一个破折号替换所有空格

这就是我们在软件中使用的内容

/// <summary>
/// Convert a name into a string that can be appended to a Uri.
/// </summary>
private static string EscapeName(string name)
{
    if (!string.IsNullOrEmpty(name))
    {
        name = NormalizeString(name);

        // Replaces all non-alphanumeric character by a space
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < name.Length; i++)
        {
            builder.Append(char.IsLetterOrDigit(name[i]) ? name[i] : ' ');
        }

        name = builder.ToString();

        // Replace multiple spaces into a single dash
        name = Regex.Replace(name, @"[ ]{1,}", @"-", RegexOptions.None);
    }

    return name;
}

/// <summary>
/// Strips the value from any non english character by replacing thoses with their english equivalent.
/// </summary>
/// <param name="value">The string to normalize.</param>
/// <returns>A string where all characters are part of the basic english ANSI encoding.</returns>
/// <seealso cref="http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net"/>
private static string NormalizeString(string value)
{
    string normalizedFormD = value.Normalize(NormalizationForm.FormD);
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < normalizedFormD.Length; i++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalizedFormD[i]);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            builder.Append(normalizedFormD[i]);
        }
    }

    return builder.ToString().Normalize(NormalizationForm.FormC);
}
你可以在那里找到身份证。这两个URL指向同一页面:

http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net

http://stackoverflow.com/questions/249087/
您需要咨询,它描述URI以及什么是合法的,什么是不合法的

除了有效性之外,可能还需要一个可读的URI。在这种情况下,请删除所有非字母数字字符


在stackoverflow中,标题是可变的,因此使用ID作为唯一但不变的URI区分符。如果您没有可更改的标题,那么只使用文本就可以了。如果可以在发布后编辑标题,则最好使用id

对于问题1:Rob Conery有一个非常有用的方法来清理字符串以生成段塞。下面是扩展方法(只需将其添加到静态类中):

公共静态字符串CreateSlug(此字符串源)
{
var regex=新的regex(@“([^a-z0-9\-]?)”);
var slug=“”;
如果(!string.IsNullOrEmpty(源))
{
slug=source.Trim().ToLower();
段塞=段塞。替换('''-');
段塞=段塞。替换(“-”、“-”);
段塞=段塞。替换(“-”,“-”);
if(regex!=null)
slug=regex.Replace(slug,“”);
if(段塞长度*2<震源长度)
返回“”;
如果(段塞长度>100)
slug=slug.子串(0100);
}
回流段塞;
}

对于问题2,如果希望列是唯一的,可以在数据库中的列上放置唯一约束。这将允许您捕获异常并提供有用的用户输入。如果您不喜欢这样,那么依赖post标识符可能是一个不错的选择。

或者,不要捕获异常,而是对URI标题进行查询,如果得到结果,则向其添加-1,然后再添加-2,以此类推,直到在DB中找不到条目为止。当然,您仍然需要捕获异常,但理想情况下,您可以更聪明地插入数据库。感谢您提供的有趣和有用的代码!我还决定使用id和名称的组合,正如你所建议的,stackoverflow也实现了。我不喜欢这种“虚假”的SEO,因为一半的URL是没有意义的。顺便说一句,你也可以在网站上找到这个页面,这个页面仍然有效吗?
NormalizeString
方法取代的所有内容现在都有效了吗?你必须解释一下“有效”是什么意思。OP要求删除字符串中的所有内容,以模仿StackOverflow提供的行为。
http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net

http://stackoverflow.com/questions/249087/
public static string CreateSlug(this string source)
{
    var regex = new Regex(@"([^a-z0-9\-]?)");
    var slug = "";

    if (!string.IsNullOrEmpty(source))
    {
        slug = source.Trim().ToLower();
        slug = slug.Replace(' ', '-');
        slug = slug.Replace("---", "-");
        slug = slug.Replace("--", "-");
        if (regex != null)
            slug = regex.Replace(slug, "");

        if (slug.Length * 2 < source.Length)
            return "";

        if (slug.Length > 100)
            slug = slug.Substring(0, 100);
    }
    return slug;
}