如何在创建友好URL时删除无效字符(即如何创建slug)?

时间:2010-07-18 10:59:23

标签: asp.net url-rewriting slug

说我有这个网页:
http://ww.xyz.com/Product.aspx?CategoryId=1

如果CategoryId = 1的名称是“Dogs”,我想将URL转换为如下内容:
http://ww.xyz.com/Products/Dogs

问题是类别名称是否包含外来字符(或对于网址无效)字符。如果CategoryId = 2的名称是“Göraäldre”,那么新网址应该是什么?

逻辑上应该是:
http://ww.xyz.com/Products/Göraäldre
但它不会起作用。首先是因为空间(我可以很容易地用短划线取代)但是外国人物呢?在Asp.net中,我可以使用URLEncode函数,它可以得到这样的结果:
http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
但我不能说它比原始网址(http://ww.xyz.com/Product.aspx?CategoryId=2

更好

理想情况下,我想生成这个,但我怎样才能自动执行此操作(即将外来字符转换为'安全'url字符):
http://ww.xyz.com/Products/Gora-aldre

4 个答案:

答案 0 :(得分:27)

我已经提出了以下两种扩展方法(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;
    }

答案 1 :(得分:2)

使用以下内容将非ASCII字符音译为ASCII:

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

=> "eaaoiO"

Source

答案 2 :(得分:0)

值得考虑的另一件事是:

如果用户提供了您要转换为网址友好标题的好听的音乐字符串,那么您应该考虑使用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--fjqr6lw2ek78az68apunycode

答案 3 :(得分:-1)

我使用http://www.blackbeltcoder.com/Articles/strings/converting-text-to-a-url-friendly-slug中描述的功能。它不直接支持非英文字符,但可以轻松更新以支持其他字符。

我喜欢它,因为它会产生非常干净的slu ..