如何用 URL 中的破折号替换最后一个“/”

How to replace the last "/" with a dash in a URL

我在基于 Sinatra 的应用程序中有这个 URL:

<li><a href="/blog/<%= blog.title.tr(' ', '-') %>/<%= blog.slug %>"
             method="get">Show</a></li>

当我点击它时,URL 看起来像这样:

http://127.0.0.1:9292/blog/A-lovely-day/654790

我正在尝试将最后一个 / 也设为 -,所以它将是:

http://127.0.0.1:9292/blog/A-lovely-day-654790

如何在 URL 渲染后替换它?

您可以指定多个字符进行变换

blog.title.tr(" /", "-")
r = /
    .*  # match any character zero or more times (greedily)
    \K  # forget all matches so far
    \/  # match a forward slash
    /x  # free-spacing regex definition mode

要return一个新字符串替换为:

blog.title.sub(r, '-')

要在现有字符串中进行替换:

blog.title.sub!(r, '-')

可以使用捕获组代替 \K:

blog.title.sub(/(.*)\/(.*)/, '-')

在现有字符串中进行替换的另一种方法:

blog.title[blog.title.rindex('/')] = '-'

鉴于您开始于:

斜杠不是标题的一部分,只是红色字符。将代码中的-替换为:

以下是我的处理方式:

require 'uri'

title = 'A lovely day'
slug = '654790'

uri = URI.parse('http://127.0.0.1:9292/blog/')
[*title.split, slug].join('-') # => "A-lovely-day-654790"
uri.path += [*title.split, slug].join('-')

uri.to_s # => "http://127.0.0.1:9292/blog/A-lovely-day-654790"

在控制器中生成URL,只在视图中输出变量

使用内置工具总是好的。 URI 在操作 URLs/URIs 时有帮助,并在必要时理解适当的编码。

此外,请记住 path 实际上是一个文件路径名,因此有时文件包对 manipulating/splitting/joining 非常有用。这不是一个很好的例子,但它派上用场了。

'http://127.0.0.1:9292/blog/A-lovely-day/654790'.
  sub(/\/(?!.*\/)/,'-') # match a / that is not followed by another /
#=> "http://127.0.0.1:9292/blog/A-lovely-day-654790"