Как вы удаляете недопустимые символы при создании дружественного URL (например, как вы создаете слаг)? - PullRequest
12 голосов
/ 18 июля 2010

Скажите, у меня есть эта веб-страница:
http://ww.xyz.com/Product.aspx?CategoryId=1

Если имя CategoryId = 1 - «Собаки», я хотел бы преобразовать URL-адрес во что-то вроде этого:
http://ww.xyz.com/Products/Dogs

Проблема в том, что имя категории содержит иностранные (или недействительные для URL) символы. Если имя CategoryId = 2 - «Göra äldre», каким должен быть новый URL?

Логически это должно быть:
http://ww.xyz.com/Products/Göra äldre
но это не сработает. Во-первых, из-за пробела (который я могу легко заменить на тире, например), но как насчет иностранных символов? В Asp.net я мог бы использовать функцию URLEncode, которая бы выглядела примерно так:
http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
но я не могу сказать, что это лучше, чем оригинальный URL (http://ww.xyz.com/Product.aspx?CategoryId=2)

В идеале я хотел бы сгенерировать это, но как я могу сделать это автоматически (например, преобразование иностранных символов в «безопасные» символы URL): http://ww.xyz.com/Products/Gora-aldre

Ответы [ 4 ]

27 голосов
/ 18 июля 2010

Я предложил 2 следующих метода расширения (asp.net / C #):

     public static string RemoveAccent(this string txt)
    {
        byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
        return System.Text.Encoding.ASCII.GetString(bytes);
    }

    public static string Slugify(this string phrase)
    {
        string str = phrase.RemoveAccent().ToLower();
        str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars          
        str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space  
        str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
        return str;
    }
2 голосов
/ 18 июля 2010

Транслитерация не-ASCII символов в ASCII, используя что-то вроде этого:

var str = "éåäöíØ";
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "eaaoiO"

( Источник )

0 голосов
/ 08 октября 2014

Стоит рассмотреть еще одну вещь:

Если пользователь предоставляет строку, такую ​​как 好听的音乐, которую вы хотите преобразовать в понятный заголовок URL, вам следует рассмотреть возможность использования IdnMapping

Например:

string urlFriendlyTitle = Slugify(url);

public static string Slugify(string text)
{
    IdnMapping idnMapping = new IdnMapping();
    text = idnMapping.GetAscii(text);

    text = RemoveAccent(text).ToLower();

    //  Remove all invalid characters.  
    text = Regex.Replace(text, @"[^a-z0-9\s-]", "");

    //  Convert multiple spaces into one space
    text = Regex.Replace(text, @"\s+", " ").Trim();

    //  Replace spaces by underscores.
    text = Regex.Replace(text, @"\s", "_");

    return text;
}

public static string RemoveAccent(string text)
{
    byte[] bytes = Encoding.GetEncoding("Cyrillic").GetBytes(text);

    return Encoding.ASCII.GetString(bytes);
}

Без этого 好听的音乐 будет преобразован в string.Empty. При этом xn--fjqr6lw2ek78az68a, который punycode

0 голосов
/ 17 декабря 2010

Я использую функцию, описанную в http://www.blackbeltcoder.com/Articles/strings/converting-text-to-a-url-friendly-slug. Она не поддерживает напрямую неанглийские символы, но может быть легко обновлена ​​для поддержки дополнительных символов.

Мне это нравится, потому что он производит очень чистый слизень.

...