画像の名前がついたファイルをそのまま作成する。

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という名前のファイルができ、そこに取得したい画像が入った。