亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用 Golang 正則表達式中的參數替換所有內容?

如何用 Golang 正則表達式中的參數替換所有內容?

Go
富國滬深 2022-01-17 19:54:40
我正在使用 Golang 正則表達式包,我想使用帶有參數的正則表達式 ReplaceAllStringFunc,而不僅僅是源字符串。例如,我想更新此文本"<img src=\"/m/1.jpg\" />  <img src=\"/m/2.jpg\" />  <img src=\"/m/3.jpg\" />"To(將“m”更改為“a”或其他任何內容):"<img src=\"/a/1.jpg\" />  <img src=\"/a/2.jpg\" />  <img src=\"/a/3.jpg\" />"我想要類似的東西:func UpdateText(text string) string {    re, _ := regexp.Compile(`<img.*?src=\"(.*?)\"`)    text = re.ReplaceAllStringFunc(text, updateImgSrc)     return text}// update "/m/1.jpg" to "/a/1.jpg" func updateImgSrc(imgSrcText, prefix string) string {    // replace "m" by prefix    return "<img src=\"" + newImgSrc + "\""}我檢查了文檔, ReplaceAllStringFunc 不支持參數,但是實現我的目標的最佳方法是什么?更一般地說,我想找到一個模式的所有出現,然后用一個由源字符串+一個新參數組成的新字符串更新每個模式,有人能給出任何想法嗎?
查看完整描述

2 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

我同意這些評論,你可能不想用正則表達式解析 HTML(壞事會發生)。


但是,讓我們假設它不是 HTML,并且您只想替換子匹配項。你可以這樣做


func UpdateText(input string) (string, error) {

    re, err := regexp.Compile(`img.*?src=\"(.*?)\.(.*?)\"`)

    if err != nil {

        return "", err

    }

    indexes := re.FindAllStringSubmatchIndex(input, -1)


    output := input

    for _, match := range indexes {

        imgStart := match[2]

        imgEnd := match[3]

        newImgName := strings.Replace(input[imgStart:imgEnd], "m", "a", -1)

        output = output[:imgStart] + newImgName + input[imgEnd:]

    }

    return output, nil

}


(請注意,我稍微更改了您的正則表達式以分別匹配文件擴展名)


查看完整回答
反對 回復 2022-01-17
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

這是我使用 html 解析器的解決方案。


func UpdateAllResourcePath(text, prefix string) (string, error) {

    doc, err := goquery.NewDocumentFromReader(strings.NewReader(text))

    if err != nil {

        return "", err

    }


    sel := doc.Find("img")

    length := len(sel.Nodes)

    for index := 0; index < length; index++ {

        imgSrc, ok := sel.Eq(index).Attr("src")

        if !ok {

            continue

        }


        newImgSrc, err := UpdateResourcePath(imgSrc, prefix)    // change the imgsrc here

        if err != nil {

            return "", err

        }


        sel.Eq(index).SetAttr("src", newImgSrc)

    }


    newtext, err := doc.Find("body").Html()

    if err != nil {

        return "", err

    }


    return newtext, nil

}


查看完整回答
反對 回復 2022-01-17
  • 2 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號