diff --git a/tree.go b/tree.go index 121e02c6..f32bed13 100644 --- a/tree.go +++ b/tree.go @@ -70,10 +70,10 @@ func (t *Tree) addtree(segments []string, tree *Tree, wildcards []string, reg st if w == "." || w == ":" { continue } - regexpStr = "/([^/]+)" + regexpStr + regexpStr = "([^/]+)/" + regexpStr } } - reg = reg + regexpStr + reg = strings.Trim(reg+regexpStr, "/") filterTreeWithPrefix(tree, append(wildcards, params...), reg) t.wildcard = tree } else { @@ -99,9 +99,9 @@ func (t *Tree) addtree(segments []string, tree *Tree, wildcards []string, reg st rr = rr + "([^/]+)/" } } - regexpStr = rr + regexpStr + regexpStr = rr + regexpStr + "/" } else { - regexpStr = "/" + regexpStr + regexpStr = "/" + regexpStr + "/" } } else { for _, w := range wildcards { @@ -109,9 +109,9 @@ func (t *Tree) addtree(segments []string, tree *Tree, wildcards []string, reg st continue } if w == ":splat" { - regexpStr = "/(.+)" + regexpStr + regexpStr = "(.+)/" + regexpStr } else { - regexpStr = "/([^/]+)" + regexpStr + regexpStr = "([^/]+)/" + regexpStr } } } @@ -132,8 +132,24 @@ func filterTreeWithPrefix(t *Tree, wildcards []string, reg string) { filterTreeWithPrefix(t.wildcard, wildcards, reg) } for _, l := range t.leaves { - l.wildcards = append(wildcards, l.wildcards...) if reg != "" { + if l.regexps != nil { + l.wildcards = append(wildcards, l.wildcards...) + l.regexps = regexp.MustCompile("^" + reg + strings.Trim(l.regexps.String(), "^$") + "$") + } else { + for _, v := range l.wildcards { + if v == ":" || v == "." { + continue + } + if v == ":splat" { + reg = reg + "/(.+)" + } else { + reg = reg + "/([^/]+)" + } + } + l.regexps = regexp.MustCompile("^" + reg + "$") + l.wildcards = append(wildcards, l.wildcards...) + } filterCards := []string{} for _, v := range l.wildcards { if v == ":" || v == "." { @@ -142,12 +158,8 @@ func filterTreeWithPrefix(t *Tree, wildcards []string, reg string) { filterCards = append(filterCards, v) } l.wildcards = filterCards - if l.regexps != nil { - l.regexps = regexp.MustCompile("^" + reg + strings.Trim(l.regexps.String(), "^$") + "$") - } else { - l.regexps = regexp.MustCompile("^" + reg + "$") - } } else { + l.wildcards = append(wildcards, l.wildcards...) if l.regexps != nil { for _, w := range wildcards { if w == "." || w == ":" { diff --git a/tree_test.go b/tree_test.go index 589b64ca..97c855c0 100644 --- a/tree_test.go +++ b/tree_test.go @@ -122,6 +122,24 @@ func TestAddTree(t *testing.T) { } } +func TestAddTree2(t *testing.T) { + tr := NewTree() + tr.AddRouter("/shop/:id/account", "astaxie") + tr.AddRouter("/shop/:sd/ttt_:id(.+)_:page(.+).html", "astaxie") + t3 := NewTree() + t3.AddTree("/:version(v1|v2)/:prefix", tr) + obj, param := t3.Match("/v1/zl/shop/123/account") + if obj == nil || obj.(string) != "astaxie" { + t.Fatal("/:version(v1|v2)/:prefix/shop/:id/account can't get obj ") + } + if param == nil { + t.Fatal("get param error") + } + if param[":id"] != "123" || param[":prefix"] != "zl" || param[":version"] != "v1" { + t.Fatal("get :id :prefix :version param error") + } +} + func TestSplitPath(t *testing.T) { a := splitPath("/") if len(a) != 0 {