代码之家  ›  专栏  ›  技术社区  ›  DanDan

要在seo clean uri中删除的字符

  •  2
  • DanDan  · 技术社区  · 14 年前

    我正在使用ASP.NET/C,我希望创建唯一的(?)我正在创建的小型CMS系统的URI。

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

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

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

    3 回复  |  直到 14 年前
        1
  •  9
  •   Pierre-Alain Vigeant    14 年前

    将所有音调符号转换为其基本字符,然后使用 Char.IsLetterOrDigit .

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

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

    /// <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);
    }
    

    关于使用这些生成的名称作为唯一ID,我保证不会。将生成的名称用作SEO帮助程序,但不用作密钥解析程序。如果查看stackoverflow如何引用其页面:

    http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net
                                       ^--ID  ^--Unneeded name but helpful for bookmarks and SEO
    

    你可以在那里找到身份证。这两个URL指向同一页:

    http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net
    
    http://stackoverflow.com/questions/249087/
    
        2
  •  2
  •   Cheeso    14 年前

    你想咨询一下 IETF RFC 3986 ,它描述了URI以及什么是合法的和不合法的。

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

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

        3
  •  1
  •   Scott Arrington    14 年前

    问题1:Rob Conery有一个非常有用的 Regex-based solution 清洗管柱以产生段塞。下面是扩展方法(只需将其添加到静态类中):

    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;
    }
    

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