Как Stack Overflow генерирует URL-адреса, оптимизированные для SEO?

Вот моя версия кода Джеффа. Я seo внес следующие изменения:

  • Дефисы были добавлены таким образом, чтобы их можно было добавить, а затем их нужно было удалить, поскольку это был последний символ в строке. То есть мы никогда не хотим «мой-слизень-». Это означает дополнительное выделение строки для ее удаления в этом пограничном случае. Я решил эту проблему с помощью отложенного переноса. Если вы сравните мой код с кодом Джеффа, логику этого легко понять.
  • Его подход основан исключительно на поиске и упускает много символов, которые я обнаружил в примерах во время исследования Stack Overflow. Чтобы противостоять этому, я сначала выполняю этап нормализации (сортировка AKA, упомянутая в вопросе о переполнении мета-стека Non US-ASCII characters dropped from full (profile) URL), а затем игнорирую любые символы за пределами допустимых диапазонов. В большинстве случаев это работает ...
  • ... А когда это не так, мне также пришлось добавить таблицу поиска. Как упоминалось выше, некоторые символы не соответствуют низкому значению ASCII при нормализации. Вместо того, чтобы отбрасывать их, у меня есть ручной список исключений, который, несомненно, полон дыр, но это лучше, чем ничего. Код нормализации был вдохновлен замечательной записью Джона Ханны в вопросе о переполнении стека How can I remove accents on a string?.
  • Преобразование language-independent регистра теперь также необязательно.

    public static class Slug
    {
        public static string Create(bool toLower, params string[] values)
        {
            return Create(toLower, String.Join("-", values));
        }
    
        /// 
        /// Creates a slug.
        /// References:
        /// http://www.unicode.org/reports/tr15/tr15-34.html
        /// https://meta.stackexchange.com/questions/7435/non-us-ascii-characters-dropped-from-full-profile-url/7696#7696
        /// https://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486#25486
        /// https://stackoverflow.com/questions/3769457/how-can-i-remove-accents-on-a-string
        /// 
        /// 
        /// 
        /// 
        public static string Create(bool toLower, string value)
        {
            if (value == null)
                return "";
    
            var normalised = value.Normalize(NormalizationForm.FormKD);
    
            const int maxlen = 80;
            int len = normalised.Length;
            bool prevDash = false;
            var sb = new StringBuilder(len);
            char c;
    
            for (int i = 0; i < len; i++)
            {
                c = normalised[i];
                if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))
                {
                    if (prevDash)
                    {
                        sb.Append('-');
                        prevDash = false;
                    }
                    sb.Append(c);
                }
                else if (c >= 'A' && c <= 'Z')
                {
                    if (prevDash)
                    {
                        sb.Append('-');
                        prevDash = false;
                    }
                    // Tricky way to convert to lowercase
                    if (toLower)
                        sb.Append((char)(c | 32));
                    else
                        sb.Append(c);
                }
                else if (c == ' ' || c == ',' || c == '.' || c == '/' || c == '\\' || c == '-' || c == '_' || c == '=')
                {
                    if (!prevDash && sb.Length > 0)
                    {
                        prevDash = true;
                    }
                }
                else
                {
                    string swap = ConvertEdgeCases(c, toLower);
    
                    if (swap != null)
                    {
                        if (prevDash)
                        {
                            sb.Append('-');
                            prevDash = false;
                        }
                        sb.Append(swap);
                    }
                }
    
                if (sb.Length == maxlen)
                    break;
            }
            return sb.ToString();
        }
    
        static string ConvertEdgeCases(char c, bool toLower)
        {
            string swap = null;
            switch (c)
            {
                case 'ı':
                    swap = "i";
                    break;
                case 'ł':
                    swap = "l";
                    break;
                case 'Ł':
                    swap = toLower ? "l" : "L";
                    break;
                case 'đ':
                    swap = "d";
                    break;
                case 'ß':
                    swap = "ss";
                    break;
                case 'ø':
                    swap = "o";
                    break;
                case 'Þ':
                    swap = "th";
                    break;
            }
            return swap;
        }
    }
    

Для friendly-url получения дополнительных regular-expressions сведений, модульных тестов seo-friendly и объяснения того, почему regular-expression схема Facebook URL немного умнее, чем slugs Stack Overflows, у меня есть pretty-url expanded version of this on my blog.

regex

language-agnostic

seo

friendly-url

slug

2022-11-01T04:16:20+00:00
Вопросы с похожей тематикой, как у вопроса:

Как Stack Overflow генерирует URL-адреса, оптимизированные для SEO?