首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于匹配尾部斜杠的Compojure regex

用于匹配尾部斜杠的Compojure regex
EN

Stack Overflow用户
提问于 2011-12-05 10:41:44
回答 3查看 1.9K关注 0票数 7

也许我只是个笨蛋,但我不能在Clojure中为可选的尾部斜杠设置匹配。

代码语言:javascript
复制
lein repl
REPL started; server listening on localhost port 47383
user=> (use 'ring.mock.request 'clout.core)
nil
user=> (route-matches "/article/" (request :get "/article/"))
{}
user=> (route-matches "/article/?" (request :get "/article"))
nil
user=> (route-matches "/article/?" (request :get "/article/"))
nil
user=> (route-matches #"/article/?" (request :get "/article/"))
java.lang.IllegalArgumentException: No implementation of method: :route-matches of protocol: #'clout.core/Route found for class: java.util.regex.Pattern (NO_SOURCE_FILE:0)

在Compojure中,我可以使用什么正则表达式来匹配可选的尾部斜杠?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-05 13:55:49

clout期望作为route-matches的第一个参数的路径字符串不是正则表达式,而是一个可以包含关键字和*通配符的字符串。

我相信clout本身并不支持定义忽略尾随斜杠的路由。您可以使用一个中间件函数来解决这个问题,该函数可以删除尾随的斜杠。以下函数取自旧版本的compojure源代码(在大的重构之前),我无法确定它们是否移到了新的地方。下面是介绍这些函数的original commit

代码语言:javascript
复制
(defn with-uri-rewrite
  "Rewrites a request uri with the result of calling f with the
   request's original uri.  If f returns nil the handler is not called."
  [handler f]
  (fn [request]
    (let [uri (:uri request)
          rewrite (f uri)]
      (if rewrite
        (handler (assoc request :uri rewrite))
        nil))))

(defn- uri-snip-slash
  "Removes a trailing slash from all uris except \"/\"."
  [uri]
  (if (and (not (= "/" uri))
           (.endsWith uri "/"))
    (chop uri)
    uri))

(defn ignore-trailing-slash
  "Makes routes match regardless of whether or not a uri ends in a slash."
  [handler]
  (with-uri-rewrite handler uri-snip-slash))
票数 5
EN

Stack Overflow用户

发布于 2014-03-20 09:18:04

以下是没有依赖项的中间件的精简版本:

代码语言:javascript
复制
(defn with-ignore-trailing-slash [handler] (fn [request]
  (let [uri       (request :uri)
        clean-uri (if (and (not= "/" uri) (.endsWith uri "/"))
                    (subs uri 0 (- (count uri) 1))
                    uri)]
    (handler (assoc request :uri clean-uri)))))

欢迎使用错误修复编辑。

票数 1
EN

Stack Overflow用户

发布于 2016-03-11 02:53:18

对于那些正在寻找更压缩的解决方案的人:)

代码语言:javascript
复制
(defn- with-ignore-trailing-slash [handler]
  (fn [request]
    (let [uri (request :uri)
          clean-uri (str/replace uri #"^(.+?)/+$" "$1")]
      (handler (assoc request :uri clean-uri)))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8380468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档