Как 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
Как Stack Overflow генерирует URL-адреса, оптимизированные для SEO?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.