Sinatra路由正则表达式字母数字字符匹配

3
#get "/blog/:title-:slug" do
#  erb :"/blog/#{params[:slug]}.html
#end

标题 (:title) 和别名 (slug) 都可以包含字母和数字。

我正在尝试使用正则表达式使URL动态化。

get '/blog/*-*' do
    erb :"/blog/#{params['splat'][1]}.html"
end

我想出了上面使用通配符的版本,它可以工作,但我希望让路由更加具体。目前我在使用下面的内容时遇到困难,经过查阅 Ruby 正则表达式文档后依然不能解决。
# get '/blog\/[[:alnum:]]/-/[[:alnum:]]/' do
#   puts params['alnum']
#   erb :"/blog/#{params['alnum']}.html"
# end
1个回答

2

Sinatra接受正则表达式作为路由方法(getpost等)的参数,因此路由可以被重写为:

get %r{/blog/(\w+)-(\w+)} do
  ...
end

这将匹配所有包含字母或数字的路由。然而,捕获的值在params对象中不可用。要实现这一点,您需要使用命名捕获语法:

get %r{/blog/(?<title>\w+)-(?<slug>\w+)} do
  puts params[:title]
  puts params[:slug]
end

您还可以使用支持Unicode的[[:alnum:]]正则表达式匹配器:

get %r{/blog/(?<title>[[:alnum:]]+)-(?<slug>[[:alnum:]]+)} do
  puts params[:title]
  puts params[:slug]
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接