2010-07-18 64 views
10

说我有这个网页:
http://ww.xyz.com/Product.aspx?CategoryId=1如何在创建友好的网址时删除无效的字符(即如何创建一个slu))?

如果类别ID的名称= 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

理想情况下,我想这产生一个但我怎么能可以自动设置(即外国字符转换为“安全”的网址字符):
http://ww.xyz.com/Products/Gora-aldre

回答

24

我已经想出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; 
    } 
+3

我写了一个很大的方法,充满了使用char类的if语句,直到我找到它。好东西。 – 2012-09-28 03:46:40

+0

我认为ISAPI的确如此,但我想要更多地控制我的网址。这是一个很好的解决方案。 – 2013-03-15 07:49:21

+1

感谢您的功能。我不得不在最后添加一个连字符以用一个连字符替换两个或更多连字符。 str = System.Text.RegularExpressions.Regex.Replace(str,@“\ - +”,“ - ”); //将多个连字符转换为一个连字符 – 2014-07-09 15:50:23

2

音译非ASCII字符的ASCII,使用这样的事情:

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

=> "eaaoiO" 

Source

+1

如果某些字符不是西里尔文?我需要一个永远可以工作的解决方案。 – Anthony 2010-07-18 11:11:48

+0

然后,您需要为不同类型的编码添加更多检查。不幸的是,除非你使用一个库来完成这一切,否则这里没有魔术棒。 – hollsk 2010-07-18 11:19:40

+1

也许UnidecodeSharp库是你正在寻找的:http://unidecode.codeplex.com/ – Sjoerd 2010-07-18 11:22:07

-1

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

我喜欢它,因为它产生了一个非常干净的slu slu。

+0

在您的TextToSlug函数中,如果要转换的字符串包含重音,该怎么办?例如'fiancé'这是一个完美的英语单词。英语中有很多类似的例子。 IsLetterOrDigit会为é字符返回true,所以您最终会将它放入您的url中,这将会不正确,理想情况下应该将其转换为url中的e。 – Anthony 2010-12-18 08:25:12

+0

这里“理想”是什么意思?你是说未婚夫在一个URL中无效吗?当我使用我的代码时,这并没有出现,但如果这会导致问题,我很乐意修改它。 – 2010-12-18 08:37:52

0

值得考虑的另一件事:

如果用户提供一个字符串,如要转换为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

相关问题