【问题标题】:best way to turn a post title into an URL in c#在 C# 中将帖子标题转换为 URL 的最佳方法
【发布时间】:2010-10-17 09:52:18
【问题描述】:

我想知道将字符串(例如帖子标题)转换为描述性 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

但是,这种方式安全吗?我应该检查其他东西(比如字符串的长度) 还有其他更好的方法吗? 谢谢

【问题讨论】:

  • 我会使用破折号而不是下划线。但这只是我。
  • 我同意 dashes-vs-underscores 的评论——显然,stackoverflow 也是如此;)stackoverflow.com/questions/714653/…
  • 也许破折号比下划线更不具有侵入性,是的,它可能会更好。
  • 顺便说一句,这被称为slug

标签: c# regex url


【解决方案1】:

这就是我所做的。 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(), "-");
}

【讨论】:

    【解决方案2】:

    字符串结果 = regex.Replace(InputText,"-");

    而不是在分数下放 hypen (-),这将为 Google 搜索引擎带来更多优势。

    详情请看下面的帖子

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

    【讨论】:

    • 对于 Google 来说,连字符而不是下划线会发生什么变化?
    • 显然这个问题确实存在,但在 2007 年被消除了。搜索“google url underscore hyphen”得到了这个帖子:seroundtable.com/archives/014260.html
    【解决方案3】:

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

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

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

    【讨论】:

    • 很好,但我想知道:什么时候结果会与正则表达式解决方案不同(或更好)?
    【解决方案4】:

    您可以查看重写 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" />
    

    【讨论】:

    • 好吧,使用 urlrewriting 只是大局的一部分……我确实需要一个“urlified”标题来将其提供给 urlrewrite。
    【解决方案5】:

    如果您想避免自己这样做,可以使用像 http://urlrewriter.net/ 这样的 HttpModule 有帮助。很不错,但需要一些设置。

    【讨论】:

      【解决方案6】:

      就个人而言,我会将您的特殊字符删除与日期结合起来,这样您的示例将如下所示:

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

      这样,如果您满足于相同的标题,它也会按日期区分。我经常在我访问的一些博客上看到这一点,他们经常使用“五件随机的事情发表一篇文章”(但不是在同一天)。

      【讨论】:

      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多