1. ホーム
  2. regex

[解決済み】Stack OverflowはどのようにしてSEOに適したURLを生成しているのですか?

2022-04-17 08:20:17

質問

良い完成度とは 正規表現 とか、タイトルを取るような処理をします。

Stack OverflowのようにタイトルをURLの一部に変更するにはどうすればよいのでしょうか?

にして、それを

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

は、Stack Overflow の SEO フレンドリーな URL で使用されているものですか?

私が使用している開発環境は Ruby on Rails しかし、もし他のプラットフォーム固有のソリューション(.NET、PHP。 ジャンゴ )、それらもぜひ見てみたいです。

この先、私(あるいは他の読者)が別のプラットフォームで同じ問題に出くわすことは間違いないでしょう。

私はカスタムルートを使用しており、主に、すべての特殊文字を削除し、すべて小文字にし、すべての空白を置き換えるために文字列を変更する方法を知りたいのですが、どうすればよいですか?

解決方法は?

その方法を紹介します。なお、一見してわかるように、おそらくもっと多くのエッジ条件があるはずです。

これは2番目のバージョンで、5倍のパフォーマンスを得るために展開されたものです(そうです、ベンチマークを取りました)。この関数は1ページあたり何百回も呼び出される可能性があるので、最適化しようと考えたのです。

/// <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 メソッドのソースコードを見ることができます。 こちら .