iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Swift で文字列に含まれている URL を抽出しよう

今回は、Swift で文字列に含まれている URL を抽出する方法を簡単にまとめていこかと思います🙃

結論

下記のように NSDataDetector というクラスを使用して、テキストからリンクを抽出することができます。

func getLinkTextList(text: String) -> [String] {
    guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
        return []
    }
    let enableLinkTuples = detector.matches(in: text, range: NSRange(location: 0, length: text.count))
    return enableLinkTuples.map { checkingResult -> String in
        return (text as NSString).substring(with: checkingResult.range)
    }
}

let linkString = getLinkTextList(text: "僕の記事はこちら👉 https://yamato8010.hatenablog.com/").first!

print(linkString) // 出力: https://yamato8010.hatenablog.com

NSDataDetector とは?

自然言語テキストに対して、事前定義されたデータパターンに一致する特殊な正規表現を検出するためのオブジェクトで、日付・住所・リンク・電話番号・通過情報などを照合することができます。

一致するコンテンツの結果は、NSTextCheckingResult として返されます。ただし、NSDataDetector によって返される NSTextCheckingResult オブジェクトは、NSDataDetector が継承している NSRegularExpression によって返されるオブジェクトとは異なるようで、NSDataDetector は、返される結果のタイプに対応するプロパティがあるそうです。

基本的には、NSRegularExpression の上位互換なので、パターンマッチングしたい時は、NSDataDetector を使用する。という感じで大丈夫そうです。

NSTextCheckingResult.CheckingType の種類

iOS13 現在では、下記のようなタイプを NSDataDetector の初期化時に(NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)) 使用することができます。

type 内容
orthography 言語を特定します。結果は、orthography でアクセスでき、NSOrthography の値が渡されます。
spelling スペルのチェックをします。
grammar 文法のチェックをします。
date 日付を見つけます。結果は、date プロパティでアクセスすることができます。
address アドレスを見つけます。
url リンクを見つけます。
quote 引用符をスマート符に置き換えます。
dash dash を em-dashes に置き換えます。
replacement (c) などの文字を適切な記号に置き換えます。(この場合は、©︎)
correction スペルミスのある単語に対して自動修正を実行します。
regularExpression 正規表現と照合します。
phoneNumber 電話番号と照合します。
transitInformation フライト情報など、トランジット情報と照合します。

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com