1

StringNSRegularExpression を使用して画像の URL を取得したい。

func findURlUsingExpression(urlString: String){

    do{

        let expression = try NSRegularExpression(pattern: "\\b(http|https)\\S*(jpg|png)\\b", options: NSRegularExpressionOptions.CaseInsensitive)

        let arrMatches = expression.matchesInString(urlString, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, urlString.characters.count))

        for match in arrMatches{

            let matchText = urlString.substringWithRange(Range(urlString.startIndex.advancedBy(match.range.location) ..< urlString.startIndex.advancedBy(match.range.location + match.range.length)))
            print(matchText)
        }

    }catch let error as NSError{

        print(error.localizedDescription)
    }
}

単純な文字列だけで機能しますが、HTML String.

作業例:

let tempString = "jhgsfjhgsfhjgajshfgjahksfgjhs http://jhsgdfjhjhggajhdgsf.jpg jahsfgh asdf ajsdghf http://jhsgdfjhjhggajhdgsf.png"

findURlUsingExpression(tempString)

出力:

http://jhsgdfjhjhggajhdgsf.jpg
http://jhsgdfjhjhggajhdgsf.png

しかし、これでは機能しません: http://www.writeurl.com/text/478sqami3ukuug0r0bdb/i3r86zlza211xpwkdf2m

4

1 に答える 1

2

できるのであれば、独自の正規表現を作成しないでください。最も簡単で安全な方法は、 を使用することNSDataDetectorです。使用NSDataDetectorすることで、事前に構築された、使用頻度の高い解析ツールを活用できます。この解析ツールには、ほとんどのバグがすでに取り除かれているはずです。

これに関する良い記事があります: NSData Detector

NSDataDetector は NSRegularExpression のサブクラスですが、ICU パターンで照合する代わりに、半構造化された情報 (日付、住所、リンク、電話番号、交通機関の情報) を検出します。

import Foundation

let tempString = "jhgsfjhgsfhjgajshfgjahksfgjhs http://example.com/jhsgdfjhjhggajhdgsf.jpg jahsfgh asdf ajsdghf http://example.com/jhsgdfjhjhggajhdgsf.png"

let types: NSTextCheckingType = [.Link]
let detector = try? NSDataDetector(types: types.rawValue)
detector?.enumerateMatchesInString(tempString, options: [], range: NSMakeRange(0, (tempString as NSString).length)) { (result, flags, _) in
  if let result = result?.URL {
    print(result)
  }
}

// => "http://example.com/jhsgdfjhjhggajhdgsf.jpg"
// => "http://example.com/jhsgdfjhjhggajhdgsf.png"

例はそのサイトのもので、リンクを検索するように調整されています。

于 2016-04-05T10:56:40.547 に答える