清理网址的最佳方法是什么?我正在寻找像这样的网址
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;
}
答案 0 :(得分:3)
正则表达式肯定:
public string CleanURL(string str)
{
str = Regex.Replace(str, "[^a-zA-Z0-9 ]", "");
str = Regex.Replace(str, " +", "_");
return str;
}
(实际上没有经过测试,脱离了我的脑海。)
让我解释一下:
第一行删除不是字母数字字符(大写或小写)或空格的所有内容。 第二行用单个下划线替换任何空格序列(1或更多,顺序)。
答案 1 :(得分:3)
一般来说,最好的选择是使用白名单正则表达式,而不是删除所有不需要的字符,因为你肯定会错过一些。
到目前为止,答案很好,但我个人不想完全删除带有重音符号的变音符号和字符。所以我想出的最终解决方案看起来像这样:
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友好等效来帮助某人受到挑战。
答案 2 :(得分:2)
您应该考虑使用正则表达式。它比你上面尝试的效率要高得多。
有关正则表达式的更多信息here。
答案 3 :(得分:0)
如果你想坚持上面的方法,我建议你移动到字符串上的StringBuilder。这是因为您的每个替换操作都在创建一个新字符串。
答案 4 :(得分:0)
我可以收紧其中的一部分:
while (str.IndexOf(" ") > 0)
str = str.Replace(" ", " ");
...而不是无限数量的" "
替换。但你几乎肯定想要一个正则表达式。
答案 5 :(得分:0)
或者,有点冗长,但这只允许使用字母数字和空格(用' - '代替)
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(" ", "-");
答案 6 :(得分:0)
stackoverflow的工作方式可以在这里找到:
https://stackoverflow.com/a/25486/142014
针对速度进行了优化(&#34;这是第二个版本,展开了5倍以上的性能和#34;)并且处理了许多特殊字符。