首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的URL Slugify算法?

C#中的URL Slugify算法?
EN

Stack Overflow用户
提问于 2010-05-27 19:44:19
回答 5查看 42.6K关注 0票数 92

因此,我搜索并浏览了So上的slug标签,只找到了两个引人注目的解决方案:

这些只是问题的部分解决方案。我可以自己手动编写代码,但令我惊讶的是,目前还没有一个解决方案。

那么,在C#和/或.NET中是否有一个slugify alrogithm实现可以正确地解决拉丁字符、unicode和各种其他语言问题呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-27 20:39:56

http://predicatet.blogspot.com/2009/04/improved-c-slug-generator-or-how-to.html

代码语言:javascript
复制
public static string GenerateSlug(this string phrase) 
{ 
    string str = phrase.RemoveAccent().ToLower(); 
    // invalid chars           
    str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); 
    // convert multiple spaces into one space   
    str = Regex.Replace(str, @"\s+", " ").Trim(); 
    // cut and trim 
    str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();   
    str = Regex.Replace(str, @"\s", "-"); // hyphens   
    return str; 
} 

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

Stack Overflow用户

发布于 2013-01-27 00:15:27

在这里您可以找到一种在c#中生成url插件的方法。此函数删除所有重音符号(Marcel的答案),替换空格,删除无效字符,从末尾修剪短划线,并替换重复出现的"-“或"_”

代码:

代码语言:javascript
复制
public static string ToUrlSlug(string value){

        //First to lower case
        value = value.ToLowerInvariant();

        //Remove all accents
        var bytes = Encoding.GetEncoding("Cyrillic").GetBytes(value);
        value = Encoding.ASCII.GetString(bytes);

        //Replace spaces
        value = Regex.Replace(value, @"\s", "-", RegexOptions.Compiled);

        //Remove invalid chars
        value = Regex.Replace(value, @"[^a-z0-9\s-_]", "",RegexOptions.Compiled);

        //Trim dashes from end
        value = value.Trim('-', '_');

        //Replace double occurences of - or _
        value = Regex.Replace(value, @"([-_]){2,}", "$1", RegexOptions.Compiled);

        return value ;
    }
票数 25
EN

Stack Overflow用户

发布于 2013-11-13 02:30:28

这是我的翻译,基于Joan和Marcel的答案。我所做的更改如下:

对于中等速度的improvements.

正则表达式缓存,并将其标准化为连字符。

代码如下:

代码语言:javascript
复制
public class UrlSlugger
{
    // white space, em-dash, en-dash, underscore
    static readonly Regex WordDelimiters = new Regex(@"[\s—–_]", RegexOptions.Compiled);

    // characters that are not valid
    static readonly Regex InvalidChars = new Regex(@"[^a-z0-9\-]", RegexOptions.Compiled);

    // multiple hyphens
    static readonly Regex MultipleHyphens = new Regex(@"-{2,}", RegexOptions.Compiled);

    public static string ToUrlSlug(string value)
    {
        // convert to lower case
        value = value.ToLowerInvariant();

        // remove diacritics (accents)
        value = RemoveDiacritics(value);

        // ensure all word delimiters are hyphens
        value = WordDelimiters.Replace(value, "-");

        // strip out invalid characters
        value = InvalidChars.Replace(value, "");

        // replace multiple hyphens (-) with a single hyphen
        value = MultipleHyphens.Replace(value, "-");

        // trim hyphens (-) from ends
        return value.Trim('-');
    }

    /// See: http://www.siao2.com/2007/05/14/2629747.aspx
    private static string RemoveDiacritics(string stIn)
    {
        string stFormD = stIn.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for (int ich = 0; ich < stFormD.Length; ich++)
        {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if (uc != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(stFormD[ich]);
            }
        }

        return (sb.ToString().Normalize(NormalizationForm.FormC));
    }
}

这仍然不能解决非拉丁字符的问题。一种完全替代的解决方案是使用Uri.EscapeDataString来转换字符串的十六进制表示:

代码语言:javascript
复制
string original = "测试公司";

// %E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8
string converted = Uri.EscapeDataString(original);

然后使用数据生成一个超链接:

代码语言:javascript
复制
<a href="http://www.example.com/100/%E6%B5%8B%E8%AF%95%E5%85%AC%E5%8F%B8">
    测试公司
</a>

许多浏览器都会在地址栏中显示中文字符(见下文),但根据我有限的测试,它并不完全支持。

注意:为了使Uri.EscapeDataString以这种方式工作,必须启用iriParsing

编辑

对于那些希望在C#中生成URL Slugs的人,我建议查看以下相关问题:

How does Stack Overflow generate its SEO-friendly URLs?

这是我最终在我的项目中使用的。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2920744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档