2016-06-20 14 views
1

私はGolang regexパッケージを使用しています。ソース文字列だけでなく、regex ReplaceAllStringFuncを引数に使用したいと思います。私はのようなものを持っていると思いGolang正規表現でallを引数に置き換えるにはどうすればよいですか?

"<img src=\"https://stackoverflow.com/a/1.jpg\" /> <img src=\"https://stackoverflow.com/a/2.jpg\" /> <img src=\"https://stackoverflow.com/a/3.jpg\" />" 

例えば、私はこのテキストに( "A" または何か他のものに変更し、 "M")に

"<img src=\"/m/1.jpg\" /> <img src=\"/m/2.jpg\" /> <img src=\"/m/3.jpg\" />" 

を更新します:

func UpdateText(text string) string { 
    re, _ := regexp.Compile(`<img.*?src=\"(.*?)\"`) 
    text = re.ReplaceAllStringFunc(text, updateImgSrc) 
    return text 
} 

// update "/m/1.jpg" to "https://stackoverflow.com/a/1.jpg" 
func updateImgSrc(imgSrcText, prefix string) string { 
    // replace "m" by prefix 
    return "<img src=\"" + newImgSrc + "\"" 
} 

私はReplaceAllStringFuncは、引数をサポートしていない、ドキュメントをチェックしますが、何が私を達成するための最良の方法だろう目標?

もっと一般的には、あるパターンのすべての出現を見つけて、ソース文字列+新しいパラメータで構成された新しい文字列でそれぞれを更新したいと思います。

+3

いいえ、正規表現でHTMLを処理したくないです。 – Volker

+0

@Volker、ええと、テキストはHTML全体ではなく、ニュース記事の内容ですが、あなたの意見では最高の解決策は何でしょうか?私はstrings.Replaceがパターンに簡単にマッチすることはできないと思います。 – seaguest

+2

適切なHTMLパーサを使用してください。 ['golang.org/x/net/html'](https://godoc.org/golang.org/x/net/html)も一つの選択肢であり、[' github.com/PuerkitoBio/goquery' ](https://godoc.org/github.com/PuerkitoBio/goquery)便利です。何があるかの概要を知るには[この検索](https://godoc.org/?q=html)を実行してください。 – kostix

答えて

2

私はコメントに同意しますが、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 
} 

see on playground

を行うことができ、ここで、kostixのアドバイスを

+1

>悪いことが起こる http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Kaedys

1

おかげで(私は少し別途ファイルの拡張子に一致するように正規表現を変更したことに注意してください)私のソリューションは、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 
} 
関連する問題