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

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


image