【问题标题】:Characters to strip out in a SEO Clean Uri在 SEO Clean Uri 中删除的字符
【发布时间】:2010-01-19 18:26:25
【问题描述】:

我正在使用 asp.net/C#,我希望为我正在创建的小型 CMS 系统创建唯一的 (?) uri。

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

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

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

【问题讨论】:

    标签: c# asp.net seo uri


    【解决方案1】:

    将所有变音符号转换为它们的基本字符,然后使用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
    

    您可以在那里找到 ID。这两个 URL 指向同一个页面:

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

    【讨论】:

    • 感谢您提供有趣且有用的代码!正如您所建议的那样,我还决定使用 id 和 name 组合,并且 stackoverflow 也实现了。
    • 我不喜欢这种“假”搜索引擎优化,其中一半的 URL 毫无意义。顺便说一句,您还可以在 stackoverflow.com/questions/2095957/… 找到此页面
    • 这仍然有效吗? NormalizeString 方法替换的所有东西现在不是都有效吗?
    • 您必须解释“有效”是什么意思。 OP 要求从字符串中删除所有内容以模仿 StackOverflow 提供的行为。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      对于问题 1:Rob Conery 有一个非常有用的 Regex-based solution 来清理字符串以生成 slug。这是扩展方法(只需将其添加到静态类):

      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,如果您希望它们是唯一的,您可以在数据库中的列上放置一个 UNIQUE 约束。这将允许您捕获异常并提供有用的用户输入。如果您不喜欢这样,那么依赖帖子标识符可能是一个不错的选择。

      【讨论】:

      • or ,而不是捕获异常,而是对 URI 化的标题进行查询,如果得到结果,则将 -1 附加到它,然后附加 -2 等,直到你没有'在数据库中找不到条目。当然,您仍然必须捕获异常,但理想情况下,您可以更聪明地插入数据库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2016-04-19
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多