Jak wygenerować przyjazny adres URL w C#?

Jak mogę generować Przyjazny URL w C#? Obecnie po prostu zamieniam spacje na podkreślenie, ale jak Mogę przejść do generowania URL ' s jak przepełnienie stosu?

Na przykład Jak mogę przekonwertować:

Jak wygenerować Przyjazny URL w C#?

Do

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

Author: GateKiller, 2008-09-01

4 answers

Jest jednak kilka rzeczy, które można poprawić w rozwiązaniu Jeffa.

if (String.IsNullOrEmpty(title)) return "";
IMHO, Nie miejsce na testowanie tego. Jeśli funkcja zostanie przekazana pusty łańcuch, coś i tak poszło poważnie nie tak. Wyrzuć błąd lub w ogóle nie reaguj.
// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one
Dwa razy więcej pracy. Biorąc pod uwagę, że każda operacja tworzy cały nowy ciąg znaków, jest to złe, nawet jeśli wydajność nie jest problemem.
// 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,}", "-");

Ponownie, zasadniczo dwa razy więcej pracy: Po pierwsze, użyj regex, aby zastąpić wiele spacji w raz. Następnie ponownie użyj wyrażenia regex, aby zastąpić wiele myślników na raz. Dwa wyrażenia do przetworzenia, dwa automaty do zbudowania w pamięci, powtórzenie dwukrotnie nad łańcuchem znaków, utworzenie dwóch łańcuchów: wszystkie te operacje mogą być zwinięte do jednego.

Z czubka mojej głowy, bez żadnego testowania, byłoby to równoważne rozwiązanie:

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

Zauważ, że ta metoda używa funkcji łańcuchowych zamiast funkcji regex i funkcji char zamiast funkcji łańcuchowych, gdy tylko możliwe.

 47
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 14:26:51

Oto Jak to zrobimy. Zauważ, że jest prawdopodobnie więcej warunków brzegowych, niż myślisz na pierwszy rzut oka..

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;
 18
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-01 12:10:53

To część drogi tam (używając białej listy ważnych znaków):

new Regex("[^a-zA-Z-_]").Replace(s, "-")

Daje jednak ciąg, który kończy się na "--". Więc być może drugi regex do przycinania tych Od początku/końca łańcucha i może zastąpić wszelkie wewnętrzne "--" na" -".

 5
Author: Matt Hamilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-01 12:03:58

Oto prosta funkcja, która może przekonwertować Twój ciąg na adres Url, wystarczy przekazać tytuł lub ciąg, aby przekonwertować go na Przyjazny Dla Użytkownika adres 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();
    }
 0
Author: Arslan Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-13 10:40:19