golang 解析html時把url轉絕對路徑

golang 解析html時把url轉絕對路徑

在golang解析html時,常遇到img、a標簽的資源地址為相對路徑[../,./]的情況,這時就需要一個方法把這些地址轉換為絕對路徑。

// 返回url的絕對地址
// currUrl 當前url
func absUrl(currUrl, baseUrl string) string {
    urlInfo, err := url.Parse(currUrl)
    if err != nil {
        return ""
    }
    if urlInfo.Scheme != "" {
        return currUrl
    }
    baseInfo, err := url.Parse(baseUrl)
    if err != nil {
        return ""
    }

    u := baseInfo.Scheme + "://" + baseInfo.Host
    var path string
    if strings.Index(urlInfo.Path, "/") == 0 {
        path = urlInfo.Path
    } else {
        path = filepath.Dir(baseInfo.Path) + "/" + urlInfo.Path
    }

    rst := make([]string, 0)
    pathArr := strings.Split(path, "/")

    // 如果path是已/開頭,那在rst加入一個空元素
    if pathArr[0] == "" {
        rst = append(rst, "")
    }
    for _, p := range pathArr {
        if p == ".." {
            if rst[len(rst)-1] == ".." {
                rst = append(rst, "..")
            } else {
                rst = rst[:len(rst)-1]
            }
        } else if p != "" && p != "." {
            rst = append(rst, p)
        }
    }
    return u + strings.Join(rst, "/")
}

測試

func Test(t *testing.T) {
    str := "https://xxx.com/articles/2876/1.html"
    s := "../../2.html"
    s1 := "./../2.html"
    s2 := "/2.html"
    s3 := "./2.html"
    s4 := "https://xxx.com/2.html"
    println(absUrl(s, str)) // https://xxx.com/2.html
    println(absUrl(s1, str)) // https://xxx.com/articles/2.html
    println(absUrl(s2, str)) // https://xxx.com/2.html
    println(absUrl(s3, str)) // https://xxx.com/articles/2876/2.html
    println(absUrl(s4, str)) // https://xxx.com/2.html
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容