Как я могу создать удобный URL-адрес на C#? В настоящее время я просто заменяю пробелы подчеркиванием, но как мне создать URL-адреса, такие как переполнение стека?
Например, как я могу конвертировать:
How do I generate a Friendly URL in C#?
В
how-do-i-generate-a-friendly-url-in-C





Вот как мы это делаем. Обратите внимание, что, вероятно, существует больше граничных условий, чем вы думаете на первый взгляд.
if (String.IsNullOrEmpty(title)) return "";
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^A-Za-z0-9\-\s]", "");
// remove any leading or trailing spaces left over
title = title.Trim();
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash
title = Regex.Replace(title, @"\-{2,}", "-");
// make it all lower case
title = title.ToLower();
// if it's too long, clip it
if (title.Length > 80)
title = title.Substring(0, 79);
// remove trailing dash, if there is one
if (title.EndsWith("-"))
title = title.Substring(0, title.Length - 1);
return title;
Это часть пути (с использованием белого списка допустимых символов):
new Regex("[^a-zA-Z-_]").Replace(s, "-")
Однако он дает вам строку, оканчивающуюся на "-". Так что, возможно, второе регулярное выражение, чтобы обрезать их от начала / конца строки и, возможно, заменить любой внутренний «-» на «-».
Однако есть несколько вещей, которые можно улучшить с помощью решения Джеффа.
if (String.IsNullOrEmpty(title)) return "";
ИМХО, не место это проверять. Если в функцию передается пустая строка, все равно что-то пошло не так. Выкинуть ошибку или вообще не реагировать.
// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one
В два раза больше работы. Учитывая, что каждая операция создает целую новую строку, это плохо, даже если производительность не является проблемой.
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash
title = Regex.Replace(title, @"\-{2,}", "-");
Опять же, это в два раза больше работы: во-первых, используйте регулярное выражение для одновременной замены нескольких пробелов. Затем снова используйте регулярное выражение для одновременной замены нескольких тире. Два выражения для синтаксического анализа, два автомата для создания в памяти, повторение дважды по строке, создание двух строк: все эти операции могут быть свернуты в одну.
Вне всяких сомнений, без какого-либо тестирования, это было бы эквивалентным решением:
// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it's too long, clip it
if (title.Length > 80)
title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;
Обратите внимание, что этот метод использует строковые функции вместо функций регулярных выражений и функции char вместо строковых функций, когда это возможно.
Отличный ответ, спасибо, я также добавил URL = Regex.Replace (URL, @ "", ""); чтобы удалить HTML-теги, так как «мой статья здесь» превратится в «my-barticleb-here»
Путь также не может заканчиваться точкой. Также не уверен, почему вы используете new [] {'-'}, когда вы могли бы просто использовать '-'.
вот простая функция, которая может преобразовать вашу строку в URL-адрес, вам просто нужно передать заголовок или строку, она преобразует ее в удобный для пользователя URL-адрес.
public static string GenerateUrl(string Url)
{
string UrlPeplaceSpecialWords = Regex.Replace(Url, @""|['"",&?%\.!()@$^_+=*:#/\-]", " ").Trim();
string RemoveMutipleSpaces = Regex.Replace(UrlPeplaceSpecialWords, @"\s+", " ");
string ReplaceDashes = RemoveMutipleSpaces.Replace(" ", "-");
string DuplicateDashesRemove = ReplaceDashes.Replace("--", "-");
return DuplicateDashesRemove.ToLower();
}
Этот ответ устарел. Джефф обновляет свой исходный ответ новой версией кода: stackoverflow.com/questions/25259/…