Вопрос

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

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

Как создать дружеский URL в C#?

В

How-Do-I Generate-A Friendy-Url-In-C

Это было полезно?

Решение

Есть несколько вещей, которые можно улучшить в решении Джеффа.

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,}", "-");

Опять же, в основном вдвое больше работы: сначала используйте Regex, чтобы заменить несколько мест одновременно. Затем используйте Regex снова, чтобы заменить несколько черт одновременно. Два выражения для разбора, два автомата для построения в памяти, дважды итерация над строкой, создают две строки: все эти операции могут быть свернуты до одного.

Вне голове, без каких -либо тестирования, это было бы эквивалентным решением:

// 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;

Обратите внимание, что этот метод использует строковые функции вместо функций regex и функций ChAR вместо строковых функций, когда это возможно.

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

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

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, "-")

Это, однако, дает вам строку, которая заканчивается "-". Так что, возможно, вторая регуляция, чтобы обрезать их с начала/конца строки, и, возможно, заменить любой внутренний «-« на «-».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top