英文:
How to use regexp get url pattern in golang?
问题
如何使用正则表达式匹配URL,并决定使用相应的函数进行处理
package main
import (
"fmt"
"net/http"
"regexp"
)
func main() {
http.HandleFunc("/pattern", resolve)
http.ListenAndServe(":8080", nil)
}
func resolve(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.URL.Host)
// 使用正则表达式匹配URL
matched, _ := regexp.MatchString(`^/pattern`, r.URL.Path)
if matched {
// 执行相应的处理函数
// ...
}
}
英文:
How to use regular expression matching URL, which does decide to use the corresponding function processing
package main
import(
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/pattern", resolve)
http.ListenAndServe(":8080", nil)
}
func resolve(w http.ResponseWriter, r * http.Request) {
fmt.Println(r.URL.Host)
}
答案1
得分: 12
http.HandleFunc()
不能用于注册匹配正则表达式的模式。简而言之,HandleFunc()
中指定的模式可以匹配固定的根路径(如 /favico.ico
)或根子树(如 /images/
),较长的模式优先于较短的模式。你可以在 ServeMux
类型的文档中找到更多详细信息。
你可以将处理程序注册到一个根子树,该子树可以匹配 /
模式的所有内容,并在处理程序内部进行进一步的正则表达式匹配和路由。
例如:
func main() {
http.HandleFunc("/", route) // 匹配所有内容
http.ListenAndServe(":8080", nil)
}
var rNum = regexp.MustCompile(`\d`) // 包含数字
var rAbc = regexp.MustCompile(`abc`) // 包含 "abc"
func route(w http.ResponseWriter, r *http.Request) {
switch {
case rNum.MatchString(r.URL.Path):
digits(w, r)
case rAbc.MatchString(r.URL.Path):
abc(w, r)
default:
w.Write([]byte("未知模式"))
}
}
func digits(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("包含数字"))
}
func abc(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("包含 abc"))
}
或者使用像 Gorilla MUX 这样的外部库。
英文:
http.HandleFunc()
can not be used to register a pattern to match a regular expression. In short, the pattern specified at HandleFunc()
can match a fixed, rooted path (like /favico.ico
) or rooted subtrees (like /images/
), longer patterns take precedence over shorter ones. You can find more details at the doc of the ServeMux
type.
What you can do is register your handler to a rooted subtree which may be everything with the /
pattern, and inside your handler you can do further regexp matching and routing.
For example:
func main() {
http.HandleFunc("/", route) // Match everything
http.ListenAndServe(":8080", nil)
}
var rNum = regexp.MustCompile(`\d`) // Has digit(s)
var rAbc = regexp.MustCompile(`abc`) // Contains "abc"
func route(w http.ResponseWriter, r *http.Request) {
switch {
case rNum.MatchString(r.URL.Path):
digits(w, r)
case rAbc.MatchString(r.URL.Path):
abc(w, r)
default:
w.Write([]byte("Unknown Pattern"))
}
}
func digits(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Has digits"))
}
func abc(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Has abc"))
}
Or use an external library like Gorilla MUX.
答案2
得分: 4
我使用 github.com/gorilla/mux 包。所以路由器看起来像这样:
func main() {
r := mux.NewRouter()
r.HandleFunc("/{name:pattern}", handle)
http.ListenAndServe(":8080", r)
}
其中 {name:pattern}
可以简单地写作 {slug}
(没有模式),或者 {id:[0-9]+}
,或者它们的组合 /{category}/{id:[0-9]+}
。在处理函数中获取它们:
func handle(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
// 对于 /{category}/{id:[0-9]+} 模式
category := params["category"]
id := params["id"]
}
运行它并尝试 curl http://localhost:8080/whatever/1
。
英文:
I use github.com/gorilla/mux package. So router looks like:
func main() {
r := mux.NewRouter()
r.HandleFunc("/{name:pattern}", handle)
http.ListenAndServe(":8080", r)
}
where {name:pattern}
could be simply {slug}
(without pattern) or {id:[0-9]+}
or combination of them /{category}/{id:[0-9]+}
. And get them in handler func:
func handle(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
// for /{category}/{id:[0-9]+} pattern
category := params["category"]
id := params["id"]
}
run it and try curl http://localhost:8080/whatever/1
答案3
得分: 1
Golang没有内置的正则表达式(regex)支持来进行URL匹配。而且从头开始实现它有些复杂。
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论