什么是一个好的完整正则表达式或其他一些可以取标题的过程:
如何将标题更改为像 Stack Overflow 一样的 URL 的一部分?
并将其变成
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
SEO 友好 URL 中使用的那个?
我使用的开发环境是Ruby onRails,但如果有其他一些特定于平台的解决方案(.NET、PHP、Django),我也很想看到这些。
我确信我(或其他读者)会在不同的平台上遇到同样的问题。
我正在使用自定义路由,我主要想知道如何将字符串更改为删除所有特殊字符,全部小写,并替换所有空格。
这是我们如何做到的。请注意,可能存在比您乍一看更多的边缘条件。
这是第二个版本,性能提高了 5 倍(是的,我对它进行了基准测试)。我想我会优化它,因为这个函数每页可以调用数百次。
/// <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方法源代码可以在这里找到。
RemapInternationalCharToAscii