【问题标题】:What is the Best Way to Clean a URL with a Title in it清理带有标题的 URL 的最佳方法是什么
【发布时间】:2022-03-04 19:58:50
【问题描述】:

清理 URL 的最佳方法是什么?我正在寻找这样的网址

what_is_the_best_headache_medication

我当前的代码

public string CleanURL(string str)
{
    str = str.Replace("!", "");
    str = str.Replace("@", "");
    str = str.Replace("#", "");
    str = str.Replace("$", "");
    str = str.Replace("%", "");
    str = str.Replace("^", "");
    str = str.Replace("&", "");
    str = str.Replace("*", "");
    str = str.Replace("(", "");
    str = str.Replace(")", "");
    str = str.Replace("-", "");
    str = str.Replace("_", "");
    str = str.Replace("+", "");
    str = str.Replace("=", "");
    str = str.Replace("{", "");
    str = str.Replace("[", "");
    str = str.Replace("]", "");
    str = str.Replace("}", "");
    str = str.Replace("|", "");
    str = str.Replace(@"\", "");
    str = str.Replace(":", "");
    str = str.Replace(";", "");
    str = str.Replace(@"\", "");
    str = str.Replace("'", "");
    str = str.Replace("<", "");
    str = str.Replace(">", "");
    str = str.Replace(",", "");
    str = str.Replace(".", "");
    str = str.Replace("`", "");
    str = str.Replace("~", "");
    str = str.Replace("/", "");
    str = str.Replace("?", "");
    str = str.Replace("  ", " ");
    str = str.Replace("   ", " ");
    str = str.Replace("    ", " ");
    str = str.Replace("     ", " ");
    str = str.Replace("      ", " ");
    str = str.Replace("       ", " ");
    str = str.Replace("        ", " ");
    str = str.Replace("         ", " ");
    str = str.Replace("          ", " ");
    str = str.Replace("           ", " ");
    str = str.Replace("            ", " ");
    str = str.Replace("             ", " ");
    str = str.Replace("              ", " ");
    str = str.Replace(" ", "_");
    return str;
}

【问题讨论】:

  • 该代码在 Daily WTF 中看起来很棒... ;-)
  • 哈哈..lol..我知道我知道我需要学习正则表达式
  • 不需要正则表达式。 Linq 会做得更好。过滤 = "nonallowedchars".Aggregate(unfiltered, (u, n) => u.Replace(n, ''));

标签: c# asp.net url friendly-url


【解决方案1】:

肯定的正则表达式:

public string CleanURL(string str)
{
    str = Regex.Replace(str, "[^a-zA-Z0-9 ]", "");
    str = Regex.Replace(str, " +", "_");
    return str;
}

(没有经过实际测试,我想不到。)

让我解释一下:

第一行删除所有不是字母数字字符(大写或小写)或空格的内容。 第二行用一个下划线替换任何空格序列(1 个或多个,按顺序排列)。

【讨论】:

  • 酷。这看起来像我所拥有的,除了我更喜欢用连字符而不是下划线替换空格。对于 SEO,我认为没有区别。
  • 上面接受的答案比我在这里的答案更详细,并且包括充分的解释。
【解决方案2】:

通常,您最好的选择是使用白名单正则表达式方法,而不是删除所有不需要的字符,因为您肯定会错过一些。

到目前为止,这里的答案都很好,但我个人不想完全删除变音符号和带有重音符号的字符。所以我想出的最终解决方案是这样的:

public static string CleanUrl(string value)
{
    if (value.IsNullOrEmpty())
        return value;

    // replace hyphens to spaces, remove all leading and trailing whitespace
    value = value.Replace("-", " ").Trim().ToLower();

    // replace multiple whitespace to one hyphen
    value = Regex.Replace(value, @"[\s]+", "-");

    // replace umlauts and eszett with their equivalent
    value = value.Replace("ß", "ss");
    value = value.Replace("ä", "ae");
    value = value.Replace("ö", "oe");
    value = value.Replace("ü", "ue");

    // removes diacritic marks (often called accent marks) from characters
    value = RemoveDiacritics(value);

    // remove all left unwanted chars (white list)
    value = Regex.Replace(value, @"[^a-z0-9\s-]", String.Empty);

    return value;
}

使用的RemoveDiacritics方法是基于SO answer by Blair Conrad:

public static string RemoveDiacritics(string value)
{
    if (value.IsNullOrEmpty())
        return value;

    string normalized = value.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    foreach (char c in normalized)
    {
        if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
            sb.Append(c);
    }

    Encoding nonunicode = Encoding.GetEncoding(850);
    Encoding unicode = Encoding.Unicode;

    byte[] nonunicodeBytes = Encoding.Convert(unicode, nonunicode, unicode.GetBytes(sb.ToString()));
    char[] nonunicodeChars = new char[nonunicode.GetCharCount(nonunicodeBytes, 0, nonunicodeBytes.Length)];
    nonunicode.GetChars(nonunicodeBytes, 0, nonunicodeBytes.Length, nonunicodeChars, 0);

    return new string(nonunicodeChars);
}

希望通过抑制 URL 并同时保持变音符号和朋友与他们的 URL 友好等效项来帮助挑战的人。

【讨论】:

    【解决方案3】:

    您应该考虑改用正则表达式。它比您在上面尝试做的要有效得多。

    更多关于正则表达式here.

    【讨论】:

      【解决方案4】:
      1. 您如何定义“友好”网址 - 我假设您的意思是删除 _ 等。
      2. 我会在这里查看一个正则表达式。

      如果您想坚持使用上述方法,我建议您通过字符串转移到 StringBuilder。这是因为您的每个替换操作都在创建一个新字符串。

      【讨论】:

        【解决方案5】:

        我可以收紧一点:

        while (str.IndexOf("  ") > 0)
            str = str.Replace("  ", " ");
        

        ...而不是无限数量的" " 替换。但您几乎可以肯定想要一个正则表达式。

        【讨论】:

          【解决方案6】:

          或者,更详细一点,但这仅允许字母数字和空格(由“-”替换)

          string Cleaned = String.Empty;
          foreach (char c in Dirty)
              if (((c >= 'a') && (c <= 'z')) ||
                   (c >= 'A') && (c <= 'Z') ||
                   (c >= '0') && (c <= '9') ||
                   (c == ' '))
                     Cleaned += c;
          Cleaned = Cleaned.Replace(" ", "-");
          

          【讨论】:

            【解决方案7】:

            stackoverflow 的做法可以在这里找到:

            https://stackoverflow.com/a/25486/142014

            针对速度进行了优化(“这是第二个版本,性能提高了 5 倍”)并处理了许多特殊字符。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-07
              • 2013-02-03
              • 1970-01-01
              • 2017-05-07
              相关资源
              最近更新 更多