лучший способ превратить заголовок сообщения в URL в c # - PullRequest
4 голосов
/ 03 апреля 2009

Мне было интересно, какой способ превратить строку (например, заголовок записи) в описательный URL-адрес. самый простой способ, который приходит на ум, это использовать регулярные выражения, например:

public static Regex regex = new Regex(
      "\\W+",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

string result = regex.Replace(InputText,"_");

, который превращается

"мой первый (пока не такой уж и плохой) кекс !! :) .//\."

в

my_first_yet_not_so_bad_cupcake_

тогда я могу лишить последнего "_" и проверить его по моей БД и посмотреть, присутствует ли он еще. в этом случае я бы добавил конечный номер, чтобы сделать его уникальным, и перепроверил.

Я мог бы использовать это, скажем

http://myblogsite.xom/posts/my_first_yet_not_so_bad_cupcake

но так ли это безопасно? Должен ли я проверить другие вещи (например, длину строки) Есть ли другой, лучший метод, который вы предпочитаете? спасибо

Ответы [ 6 ]

2 голосов
/ 03 апреля 2009

Вот что я делаю. regStripNonAlpha удаляет все не-альфа или "-" символы. Trim () удаляет конечные и ведущие пробелы (поэтому мы не получим штрихи с обеих сторон) regSpaceToDash преобразует пробелы (или серии пробелов) в одну черту. Это хорошо сработало для меня.

static Regex regStripNonAlpha = new Regex(@"[^\w\s\-]+", RegexOptions.Compiled);
static Regex regSpaceToDash = new Regex(@"[\s]+", RegexOptions.Compiled);

public static string MakeUrlCompatible(string title)
{
    return regSpaceToDash.Replace(
      regStripNonAlpha.Replace(title, string.Empty).Trim(), "-");
}
1 голос
/ 03 апреля 2009

Вот метод, который я написал не так давно, который берет строку и форматирует ее в постоянную ссылку.

        private string FormatPermalink(string title)
        {
            StringBuilder result = new StringBuilder();
            title = title.Trim();
            bool lastOneChanged = false;
            for (int i = 0; i < title.Length; i++)
            {
                char c = title[i];
                if (!char.IsLetterOrDigit(c))
                {
                    c = '_';
                    if (lastOneChanged)
                    {
                        continue;
                    }
                    lastOneChanged = true;
                }

                else
                {
                    lastOneChanged = false;
                }

                result.Append(c);
            }

            if (result[result.Length - 1] == '_') //if last one is underscore, remove
            {
                result = result.Remove(result.Length - 1, 1);
            }
            return result.ToString();
        }

Здесь также учитываются специальные символы, поэтому, если заголовок имеет специальный символ, он просто игнорирует его и переходит к следующему.

1 голос
/ 03 апреля 2009

string result = regex.Replace (InputText, "-");

вместо заниженной оценки поставьте hypen (-), что даст дополнительное преимущество для поисковой системы Google.

См. Сообщение ниже для более подробной информации

http://www.mattcutts.com/blog/dashes-vs-underscores/

0 голосов
/ 03 апреля 2009

Лично я бы связал удаление вашего специального символа с датой, чтобы ваш пример выглядел так:

http://myblogsite.xom/posts/2009/04/03/my_first_yet_not_so_bad_cupcake

Таким образом, если вы используете один и тот же заголовок, он также дифференцируется по дате. Я часто вижу это в некоторых блогах, которые я посещаю, где они часто используют «Пять случайных вещей делают пост» (но не в тот же день).

0 голосов
/ 03 апреля 2009

Если вы хотите избежать этого самостоятельно, используйте HttpModule, например http://urlrewriter.net/ мог бы помочь. Это довольно хорошо, но требует небольшой настройки.

0 голосов
/ 03 апреля 2009

Вы можете заглянуть в URL, переписывающий HTTPModule. В сети много примеров.

После реализации в вашем файле web.config вы просто указываете регулярное выражение для сопоставления с "реальной" страницей, используя понятное для SEO имя

<!-- Rule 1: example... "/admin/somepage" redirects to..."/UI/Forms/Admin/frmPage.aspx" -->

  <add key="^/admin/(.*)" value="/UI/Forms/Admin/frm$1.aspx" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...