将帖子标题转换为c#中URL的最佳方法

时间:2009-04-03 16:20:00

标签: c# regex 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 个答案:

答案 0 :(得分:2)

这就是我的工作。 regStripNonAlpha删除所有非alpha或“ - ”字符。 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 :(得分:1)

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

而不是得分夸大( - ),这将为谷歌搜索引擎带来额外的好处。

有关详细信息,请参阅以下帖子

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

答案 2 :(得分:1)

这是我不久前写的一种方法,它采用字符串并将其格式化为永久链接。

        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();
        }

这也考虑了特殊字符,所以如果标题有一个特殊字符,它就会忽略它并转到下一个字符。

答案 3 :(得分:0)

您可以查看重写HTTPModule的URL。网上有很多例子。

在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" />

答案 4 :(得分:0)

如果您想避免自己这样做,可以使用像http://urlrewriter.net/这样的HttpModule 有帮助。它非常好,但需要一点设置。

答案 5 :(得分:0)

就个人而言,我会将你的特殊角色与日期相结合,所以你的例子看起来像是:

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

这样,如果你满足于相同的标题,它也会按日期区分。我经常在我访问的一些博客上看到这一点,他们使用“五个随机事物发帖”很多(但不是在同一天内)。