小编典典

Stack Overflow 如何生成对 SEO 友好的 URL?

all

什么是一个好的完整正则表达式或其他一些可以取标题的过程:

如何将标题更改为像 Stack Overflow 一样的 URL 的一部分?

并将其变成

how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow

SEO 友好 URL 中使用的那个?

我使用的开发环境是Ruby onRails,但如果有其他一些特定于平台的解决方案(.NET、PHP、Django),我也很想看到这些。

我确信我(或其他读者)会在不同的平台上遇到同样的问题。

我正在使用自定义路由,我主要想知道如何将字符串更改为删除所有特殊字符,全部小写,并替换所有空格。


阅读 64

收藏
2022-05-13

共1个答案

小编典典

这是我们如何做到的。请注意,可能存在比您乍一看更多的边缘条件。

这是第二个版本,性能提高了 5 倍(是的,我对它进行了基准测试)。我想我会优化它,因为这个函数每页可以调用数百次。

/// <summary>
/// Produces optional, URL-friendly version of a title, "like-this-one". 
/// hand-tuned for speed, reflects performance refactoring contributed
/// by John Gietzen (user otac0n) 
/// </summary>
public static string URLFriendly(string title)
{
    if (title == null) return "";

    const int maxlen = 80;
    int len = title.Length;
    bool prevdash = false;
    var sb = new StringBuilder(len);
    char c;

    for (int i = 0; i < len; i++)
    {
        c = title[i];
        if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))
        {
            sb.Append(c);
            prevdash = false;
        }
        else if (c >= 'A' && c <= 'Z')
        {
            // tricky way to convert to lowercase
            sb.Append((char)(c | 32));
            prevdash = false;
        }
        else if (c == ' ' || c == ',' || c == '.' || c == '/' || 
            c == '\\' || c == '-' || c == '_' || c == '=')
        {
            if (!prevdash && sb.Length > 0)
            {
                sb.Append('-');
                prevdash = true;
            }
        }
        else if ((int)c >= 128)
        {
            int prevlen = sb.Length;
            sb.Append(RemapInternationalCharToAscii(c));
            if (prevlen != sb.Length) prevdash = false;
        }
        if (i == maxlen) break;
    }

    if (prevdash)
        return sb.ToString().Substring(0, sb.Length - 1);
    else
        return sb.ToString();
}

要查看此替换的代码的先前版本(但在功能上等效,并且速度快 5 倍),请查看此帖子的修订历史记录(单击日期链接)。

另外,RemapInternationalCharToAscii方法源代码可以在这里找到。

2022-05-13