Как создать удобный URL-адрес на C#?

Как я могу создать удобный URL-адрес на C#? В настоящее время я просто заменяю пробелы подчеркиванием, но как мне создать URL-адреса, такие как переполнение стека?

Например, как я могу конвертировать:

How do I generate a Friendly URL in C#?

В

how-do-i-generate-a-friendly-url-in-C

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
28
0
16 139
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот как мы это делаем. Обратите внимание, что, вероятно, существует больше граничных условий, чем вы думаете на первый взгляд.

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;

Этот ответ устарел. Джефф обновляет свой исходный ответ новой версией кода: stackoverflow.com/questions/25259/…

Tom Lokhorst 03.03.2009 20:45

Это часть пути (с использованием белого списка допустимых символов):

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»

Tom Gullen 07.03.2011 21:26

Путь также не может заканчиваться точкой. Также не уверен, почему вы используете new [] {'-'}, когда вы могли бы просто использовать '-'.

Yuriy Faktorovich 07.03.2011 21:43

вот простая функция, которая может преобразовать вашу строку в 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();
    }

Другие вопросы по теме