Сведения о вопросе

HOLY

10:42, 5th August, 2020

Теги

Как переполнение стека генерирует свой SEO-дружественный URLs?

Просмотров: 500   Ответов: 1

Что такое хорошее полное регулярное выражение или какой-то другой процесс, который взял бы название:

Как изменить заголовок, чтобы он был частью URL, как переполнение стека?

и превратить его в

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

то есть используется в SEO-дружественном URLs на Stack Overflow?

Среда разработки, которую я использую, является Ruby на Rails, но если есть какие-то другие решения для конкретной платформы (.NET, PHP, Django), я бы тоже хотел их увидеть.

Я уверен, что я (или другой читатель) столкнусь с той же проблемой на другой платформе в будущем.

Я использую пользовательские маршруты, и я в основном хочу знать, как изменить строку, чтобы все специальные символы были удалены, все это строчные буквы, и все whitespace заменено.



  Сведения об ответе

KOMP

21:06, 1st October, 2020

Вот как мы это делаем. Обратите внимание, что существует, вероятно, больше граничных условий, чем вы понимаете на первый взгляд.

Это вторая версия, развернутая для 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 можно найти здесь .


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться