Александър обнови решението на 12.10.2013 10:45 (преди над 4 години)
+package main
+
+import "regexp"
+
+func parseFirstDir(src string) string {
+ regexUpDir := regexp.MustCompile("[^/]+/\\.\\.(/|$)")
+ stringList := regexUpDir.Split(src, 2)
+ if len(stringList) == 2 {
+ return stringList[0] + stringList[1]
+ } else {
+ return stringList[0]
+ }
+}
+
+func parsePath(path string) string {
+ //add / at the beginning to make sure we have it
+ oldPath := "/" + path
+
+ regexExtraSlashes := regexp.MustCompile("/(/+)")
+ newPath := regexExtraSlashes.ReplaceAllString(oldPath, "/")
+
+ //parse all valid substrings that go into a dir and then leave it
+ for {
+ oldPath = newPath
+ newPath = parseFirstDir(oldPath)
+ if oldPath == newPath {
+ break
+ }
+ }
+
+ //parse all extra single dots and double dots
+ regexExtraDots := regexp.MustCompile("(^\\./|/\\./|/\\.$)|(^\\.\\./|/\\.\\./|/\\.\\.$)")
+ newPath = regexExtraDots.ReplaceAllString(newPath, "/")
+ newPath = regexExtraSlashes.ReplaceAllString(newPath, "/")
+
+ return newPath
+}
Това наименоване newPath
и oldPath
ми е доста странно. Дори все още не съм сигурен кое е старото на oldPath
.
Иначе хакът да заместваш неща като ../
или ./
с /
, след което да премахваш дублиращите се наклонени черти е доста любопитен.