Персонажи, которые нужно убрать в SEO Clean Uri - PullRequest
2 голосов
/ 19 января 2010

Я использую asp.net/C# и ищу уникальный (?) Uris для небольшой системы CMS, которую я создаю.

Я генерирую сегмент uri из заголовка моих статей, поэтому, например, если заголовок «Моя удивительная статья», то uri будет www.website.com/news/my-amazing-article

Есть две части этого. Во-первых, каких персонажей, по вашему мнению, мне нужно раздеть? Я заменяю пробелы на «-», и я думаю, что я должен удалить символ «/» тоже. Можете ли вы вспомнить что-нибудь еще, что может вызвать проблемы? "?" возможно? Должен ли я удалить все не-буквенные символы?

Второй вопрос, о котором я упоминал выше, МОЖЕТ быть уникальным. Я собирался проверить список URI перед добавлением, чтобы убедиться в уникальности, однако я вижу, что при переполнении стека используется число плюс URI. Я полагаю, это позволяет дублировать названия? Как вы думаете, это будет лучше?

Ответы [ 3 ]

9 голосов
/ 19 января 2010

Преобразуйте все диакритические знаки в их базовые символы, а затем удалите все, что не является буквой или цифрой, используя Char.IsLetterOrDigit.

Затем замените все пробелы одной чертой.

Это то, что мы используем в нашем программном обеспечении.

/// <summary>
/// Convert a name into a string that can be appended to a Uri.
/// </summary>
private static string EscapeName(string name)
{
    if (!string.IsNullOrEmpty(name))
    {
        name = NormalizeString(name);

        // Replaces all non-alphanumeric character by a space
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < name.Length; i++)
        {
            builder.Append(char.IsLetterOrDigit(name[i]) ? name[i] : ' ');
        }

        name = builder.ToString();

        // Replace multiple spaces into a single dash
        name = Regex.Replace(name, @"[ ]{1,}", @"-", RegexOptions.None);
    }

    return name;
}

/// <summary>
/// Strips the value from any non english character by replacing thoses with their english equivalent.
/// </summary>
/// <param name="value">The string to normalize.</param>
/// <returns>A string where all characters are part of the basic english ANSI encoding.</returns>
/// <seealso cref="/224770/kak-udalit-diakriticheskie-znaki-aktsenty-iz-stroki-v-net"/>
private static string NormalizeString(string value)
{
    string normalizedFormD = value.Normalize(NormalizationForm.FormD);
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < normalizedFormD.Length; i++)
    {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalizedFormD[i]);
        if (uc != UnicodeCategory.NonSpacingMark)
        {
            builder.Append(normalizedFormD[i]);
        }
    }

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

Что касается использования этих сгенерированных имен в качестве уникального идентификатора, я бы за это. Используйте сгенерированное имя в качестве помощника SEO, но не в качестве ключевого преобразователя. Если вы посмотрите, как stackoverflow ссылается на их страницы:

/224770/kak-udalit-diakriticheskie-znaki-aktsenty-iz-stroki-v-net
                                   ^--ID  ^--Unneeded name but helpful for bookmarks and SEO

Вы можете найти ID там. Эти два URL указывают на одну и ту же страницу:

/224770/kak-udalit-diakriticheskie-znaki-aktsenty-iz-stroki-v-net

http://stackoverflow.com/questions/249087/
2 голосов
/ 19 января 2010

Вы хотите обратиться к IETF RFC 3986 , в котором описаны URI, а также то, что является законным и не законным.

Помимо достоверности, может быть, вам также нужен читаемый URI. В этом случае удалите все не алфавитно-цифровые символы.

В stackoverflow заголовок является изменяемым, следовательно, используется идентификатор для уникального, но неизменного отличительного признака для URI. Если у вас нет изменяемых заголовков, тогда вы должны быть в порядке, просто используя текст. Если вы можете редактировать заголовки после публикации, тогда идентификатор может быть предпочтительнее.

1 голос
/ 19 января 2010

К вопросу 1: у Роба Конери есть довольно полезное решение на основе регулярных выражений для очистки строк для генерации слизняков. Вот метод расширения (просто добавьте его в статический класс):

public static string CreateSlug(this string source)
{
    var regex = new Regex(@"([^a-z0-9\-]?)");
    var slug = "";

    if (!string.IsNullOrEmpty(source))
    {
        slug = source.Trim().ToLower();
        slug = slug.Replace(' ', '-');
        slug = slug.Replace("---", "-");
        slug = slug.Replace("--", "-");
        if (regex != null)
            slug = regex.Replace(slug, "");

        if (slug.Length * 2 < source.Length)
            return "";

        if (slug.Length > 100)
            slug = slug.Substring(0, 100);
    }
    return slug;
}

Для вопроса 2 вы можете просто наложить уникальное ограничение на столбец в базе данных, если хотите, чтобы они были уникальными. Это позволит вам перехватить исключение и предоставить полезный пользовательский ввод. Если вам это не нравится, то, вероятно, хорошая альтернатива - полагаться на идентификатор сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...