ライブラリを使わないでmetaタグを取得する

久々の投稿だ〜(✿´ ꒳ ` )
ここではWKWebViewからhtmlを取得し、そのhtmlからmetaタグ達を取得する方法を書きます！！urlから行いたい方はいったんhtmlまで取得を行なってください🙇‍♀️

ちなみに、ライブラリ使うなら以下おすすめ。取れるものがこれで揃えば以下のライブラリは使いやすいのでおすすめします！！

https://github.com/satoshi-takano/OpenGraph

**追記:**
**コメントをいただきました。**
**metaタグの[<meta property=]の間の余白がまちまちでくる可能性がある場合は以下の正規表現の\\sは\\s+としてください。**
**まちまちで来る可能性ですがmetaタグ取得のサイトが決まっていないなどの場合です。**

#code

WKWebViewからhtmlをゲットして処理しているところ

```.swift
self.wkWebView?.evaluateJavaScript("document.getElementsByTagName('html')[0].innerHTML", completionHandler: { (html, error) -> Void in
            if let html = html{
                let metas = htmlPaser.parse(htmlString: html as! String)
                let parseMetas = htmlPaser.parseMetasGet(htmlString: html as! NSString, textCheckingResults:metas)
                print("\(parseMetas)")
            }
            
            if let error = error{
                let errorText = error.localizedDescription
                print("\(errorText)")
            }
        })
```

大元のクラス

```.swift
class htmlPaser: NSObject {

    static func parse(htmlString: String) -> [NSTextCheckingResult]{
        let metatagRegex  = try! NSRegularExpression(
            pattern: "<meta\\sproperty=(?:\"|\')(og|article):([a-zA_Z:]+?)(?:\"|\')\\scontent=\"(.*?)\"",
            options: [.dotMatchesLineSeparators]
        )
        let metaTagMatches = metatagRegex.matches(in: htmlString,
                                                  options: [],
                                                  range: NSMakeRange(0, htmlString.count))
        if metaTagMatches.isEmpty {
            return []
        }else{
            return metaTagMatches
        }
    }
    
    static func parseMetasGet(htmlString: NSString, textCheckingResults:[NSTextCheckingResult]) -> [String:String]{
        var parseMetas:[String:String] = [:]
        textCheckingResults.forEach {
            let withRange:NSString = htmlString.substring(with: NSRange(location: $0.range.location, length: ($0.range.length))) as NSString
            let regularExpression:String = "^<meta\\sproperty=(?:\"|\')(og|article):([a-zA_Z:]+?)(?:\"|\')\\scontent=\"(.*?)\""
            let rd = try? NSRegularExpression(pattern: regularExpression, options: NSRegularExpression.Options())
            
            if let r = rd?.firstMatch(in: withRange as String, options: NSRegularExpression.MatchingOptions(), range: NSMakeRange(0, withRange.length)) {
                let property0:String = withRange.substring(with: r.rangeAt(1))
                let property1:String = withRange.substring(with: r.rangeAt(2))
                let content:String = withRange.substring(with: r.rangeAt(3))
                
                let property = property0 + ":" + property1
                parseMetas[property] = content
            }else{
                print("値はありません")
            }
        }
        return parseMetas
    }
}
```

#やっていることを大まかに説明

- jsを使いhtmlを取得
- そのhtmlからmetaタグを抜き出す(語弊があります。詳しくはmetaタグのある位置情報などを格納する集合体みたいなの作っています)
- 最後metaタグの文字列を出して行ってそれをいい感じに分解、辞書に格納しています

#参考にさせていただいたurl
https://github.com/satoshi-takano/OpenGraph
https://qiita.com/_tid_/items/8705275813e740d693ef
https://qiita.com/moaible/items/85d80173bb8ed7f64b74
http://www.office-matsunaga.biz/ios/description.php?id=28
https://qiita.com/niwasawa/items/6237989e60a3a0155ff2

#参考github
https://github.com/sachiko-kame/metaGetSample/tree/master/metatagGetSample

#参考画像
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">結構前に書いた記事ですが今更Sampleを作ってみました。<br>github上がってます(/ω＼)<br>※あくまでどんなものが出来るかのsampleなので実装は雑です。ご了承ください。<br>qiitaURL:<a href="https://t.co/qgrVyAzQLw">https://t.co/qgrVyAzQLw</a><br><br>githubURL:<a href="https://t.co/J3ovaCeOSq">https://t.co/J3ovaCeOSq</a> <a href="https://t.co/B2bTRkE7ba">pic.twitter.com/B2bTRkE7ba</a></p>&mdash; sachiko (@854729) <a href="https://twitter.com/854729/status/1147531823171301376?ref_src=twsrc%5Etfw">2019年7月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#最後に
ネーミンぐセンスや、これはこうした方がもっと素敵になるよの意見を期待しています(>ω<)
宜しくお願いします。正規表現( ･ὢ･ 。)またsample作れればやりたいと思います！