画像の名前がついたファイルをそのまま作成する。
package main import ( "fmt" "io/ioutil" "log" "net/http" "os" "regexp" "strings" ) func main() { var line string line = "<p><img src=\"/site/files10/P5100314.JPG\" alt=\"\" /></p>" r := regexp.MustCompile("<img.*src=\"(.*?)\".*?>") res := r.FindStringSubmatch(line) if len(res) > 1 { n := strings.LastIndex(res[1], "/") p := res[1][n+1:] fmt.Println(p) url := "https://saitodev.co" + res[1] response, err := http.Get(url) if err != nil { log.Fatal(err) } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { log.Fatal(err) } file, err := os.Create(p) if err != nil { log.Fatal(err) } defer file.Close() file.Write(body) } }
line = "<p><img src=\"/site/files10/P5100314.JPG\" alt=\"\" /></p>"で植物のミカタの任意の画像のソースコードを入力する。r := regexp.MustCompile("<img.*src=\"(.*?)\".*?>")でregexp構造体にsrc属性の値をとってこいという正規表現のパターンを与える。res := r.FindStringSubmatch(line)では、imgタグのsrc属性の値(src=の=から右の部分)を取得する。FindStringSubmatchは、画像のパスが取得できれば、結果が値が2個の配列が返ってくる。取得できなければ値が0個の配列が返ってくる。結果が1個よりも大きかったら、画像のパスを取得できていることになるので、if len(res) > 1 とする。lenは、要素数を調べることができる関数である。今、res[1]の中身は/site/files10/P5100314.JPGである。取得したい画像の名前は、P5100314.JPGで最後の/から後の部分である。
n := strings.LastIndex(res[1], "/")のstrings.LastIndexは、res[1]の中で、最後に/が現れる位置をインデックスで取得するという意味がある。よって、nには、/がある位置の数が入る。今ここでは、13番目となる。14番目の値からファイル名になる。p := res[1][n+1:]で、res[1]の中でn+1から最後の文字まで切り抜いたものをpとする。
>今回取得したimgタグのsrc属性の値ではhttps://saitodev.coが省略されているので、まずhttps://saitodev.coにres[1]を追加したurlという値を作成する。response, err := http.Get(url)で画像ファイルの中にあるデータを取得する。body, err := ioutil.ReadAll(response.Body)で取得したデータをバイト型のデータとして読み込んだものをbodyとする。file, err := os.Create(p)でpに格納されている文字列のファイルを作成する。file.Write(body)で作成したファイルにbodyを書き込む。そうすると、下記のようにP5100314.JPGという名前のファイルができ、そこに取得したい画像が入った。