如何在Clojure中返回给定字符串的有效URL。
(re-matches #"????" "www.example.com"))
(re-matches #"????" "http://example.com"))
(re-matches #"????" "http://example.org")) // returns "http://example.org"
(re-matches #"????" "htasdtp:/something")) // returns nil
答案 0 :(得分:10)
验证网址并不简单。也许用regexp验证它太复杂了。幸运的是,有一个名为 Apache Commons 的库,其中包含UrlValidator。
由于Clojure可以使用Java库,因此您可以使用Apache Commons' UrlValidator用于验证程序中的URL。
首先,在project.clj
中添加依赖项。在依赖关系向量中添加以下行。
[commons-validator "1.4.1"]
然后,您可以定义一个返回布尔值的函数valid-url?
。
(import 'org.apache.commons.validator.UrlValidator)
(defn valid-url? [url-str]
(let [validator (UrlValidator.)]
(.isValid validator url-str)))
现在,您可以使用此功能执行所需操作。或者,您可以修改上述函数,以便在其参数为有效URL时返回URL字符串。
答案 1 :(得分:1)
询问如何在ClojureScript中验证URL基本上是在如何在Javascript中执行它,因为ClojureScript正则表达式编译为本机JavaScript正则表达式。
这是一个包含许多关于如何使用正则表达式验证网址的变体的页面:https://mathiasbynens.be/demo/url-regex
这是Diego Pierini's Javascript solution:
/^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i
在ClojureScript中:
(def url-pattern #"(?i)^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$")
(re-matches url-pattern "http://www.google.com")