什么是好的完整regular expression或其他一些可以获得 Headers 的流程:
如何将 Headers 更改为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,Django),我也很乐意看到它们 .
我相信我(或其他读者)会在不同的平台上遇到同样的问题 .
我正在使用自定义路由,我主要想知道如何更改字符串以删除所有特殊字符,它全部小写,并且所有空格都被替换 .
20 回答
这是我们如何做到的 . 请注意,乍看之下可能存在比边缘条件更多的边缘条件 .
这是第二个版本,展开了5倍以上的性能(是的,我对它进行了基准测试) . 我想我会优化它,因为这个函数每页可以被调用数百次 .
要查看此代码的先前版本(已在功能上等效,并且速度提高了5倍),请查看此帖子的修订历史记录(单击日期链接) .
此外,
RemapInternationalCharToAscii
方法源代码可以找到here .这是我的杰夫代码版本 . 我做了以下更改:
连字符的附加方式可以添加一个,然后需要删除,因为它是字符串中的最后一个字符 . 也就是说,我们从不想要“my-slug-” . 这意味着额外的字符串分配将在此边缘情况下删除它 . 我通过推迟延迟来解决这个问题 . 如果你将我的代码与Jeff的代码进行比较,那么这个逻辑很容易理解 .
他的方法纯粹基于查找,错过了我在研究Stack Overflow时在实例中发现的很多字符 . 为了解决这个问题,我首先执行规范化传递(元堆栈溢出问题Non US-ASCII characters dropped from full (profile) URL中提到的AKA整理),然后忽略可接受范围之外的任何字符 . 这大部分时间都有效......
...如果没有,我还必须添加查找表 . 如上所述,某些字符在规范化时不会映射到低ASCII值 . 而不是删除这些,我有一个手册的异常列表,无疑是充满漏洞,但它总比没有好 . 标准化代码的灵感来自于Jon Hanna在Stack Overflow问题How can I remove accents on a string?中的精彩帖子 .
案例转换现在也是可选的 .
有关详细信息,单元测试,以及为什么Facebook的URL方案比Stack Overflows更聪明,我有一个expanded version of this on my blog .
您将需要设置自定义路由以将URL指向将处理它的控制器 . 由于您使用的是Ruby on Rails,因此使用其路由引擎时introduction .
在Ruby中,您将需要一个您已经知道的正则表达式,这里是要使用的正则表达式:
你也可以使用这个JavaScript函数来生成slug的形式(这个是基于/复制自Django):
为了更好的衡量,这里是WordPress中的PHP函数,它做到了......我认为WordPress是使用花哨链接的更受欢迎的平台之一 .
这个函数以及一些支持函数可以在wp-includes / formatting.php中找到 .
如果您正在使用Rails边缘,您可以依赖Inflector.parametrize - 这是文档中的示例:
此外,如果您需要在以前版本的Rails中处理更多异国情调的角色,例如口音(éphémère),您可以使用PermalinkFu和DiacriticsFu的混合:
我不熟悉Ruby on Rails,但以下是(未经测试的)PHP代码 . 如果你觉得它很有用,你可以很快地将它翻译成Ruby on Rails .
我希望这有帮助 .
我对Ruby或Rails不太了解,但在Perl中,这就是我要做的:
我只是做了一个快速测试,它似乎工作 . 希望这相对容易转换为Ruby .
T-SQL实现,改编自dbo.UrlEncode:
假设您的模型类具有title属性,您可以简单地覆盖模型中的to_param方法,如下所示:
This Railscast episode有所有细节 . 您还可以使用以下命令确保 Headers 仅包含有效字符:
一世知道这是一个非常古老的问题但是因为现在大多数浏览器都在 support unicode urls 找到了一个很好的解决方案,它可以转换除字母以外的所有内容(在所有语言中都转换为'-') .
这可以用几种编程语言完成 .
该模式是
\\p{^L}+
然后您只需要使用它将所有非字母替换为'-' .node.js中带有xregex模块的工作示例 .
Brian的代码,在Ruby中:
downcase
将字符串转换为小写,strip
删除前导和尾随空格,第一个gsub
调用全局用空格替换空格,第二个删除不是字母或短划线的所有内容 .有一个名为PermalinkFu的小型Ruby on Rails插件,可以做到这一点 . escape method转换为适合URL的字符串 . 看看代码;那个方法很简单 .
要删除非ASCII字符,它使用iconv lib从'utf-8'转换为'ascii//ignore//translit' . 然后空间变成破折号,一切都是羽绒状的,等等 .
您可以使用以下帮助程序方法 . 它可以转换Unicode字符 .
这是我的(较慢但很有趣的)版本的Jeff代码:
我的测试字符串:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
stackoverflow solution很棒,但现代浏览器(不包括IE,像往常一样)现在可以很好地处理utf8编码:
所以我升级了提议的解决方案:
Full Code on Pastebin
编辑:Here's the code for
RemapInternationalCharToAscii
方法(在pastebin中缺少) .我喜欢不使用regular expressions的方式,所以我把它移植到PHP . 我刚刚添加了一个名为
is_between
的函数来检查字符:现在所有的浏览器都能很好地处理utf8编码,所以你可以使用WebUtility.UrlEncode方法,就像@giamin使用的HttpUtility.UrlEncode,但它在Web应用程序之外的工作 .
不不不 . 你们都错了 . 除了diacritics-fu之外,你已经到了那里,但是亚洲人物呢(对于不考虑他们的nihonjin兄弟的Ruby开发人员感到羞耻) .
Firefox和Safari都在URL中显示非ASCII字符,坦率地说它们看起来很棒 . 很高兴支持像'http://somewhere.com/news/read/お前たちはアホじゃないかい'这样的链接 .
所以这里有一些PHP代码可以做到,但我只是编写它并且没有对它进行压力测试 .
例:
输出:コリン-and-トーマス-and-アーノルド
' - 和 - 是因为&'变为' - 和 - ' .
我将代码移植到TypeScript . 它可以很容易地适应JavaScript .
我正在为
String
原型添加.contains
方法,如果您定位到最新的浏览器或ES6,则可以使用.includes
.