Удалить все компоненты пути из URL в Swift - PullRequest
0 голосов
/ 23 мая 2018

У меня есть URL с несколькими компонентами пути.Есть ли элегантный способ удалить все компоненты пути?В основном, я просто хочу сохранить схему и хост URL.И порт, если он доступен.

Я, конечно, могу создать новый объект URL, используя соответствующие свойства из существующего URL:

let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"

Или выполнить цикл по компонентам пути, удаляя последнийкомпонента, пока не останется ни одного.

Но оба эти решения не кажутся такими уж изящными, поэтому я ищу лучшее, более безопасное и более эффективное решение.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете попробовать метод Regex.Это будет более элегантно, чем другие способы.Я только что сделал быстрый код.Regex может не работать, но вы получите гораздо больше примеров регулярных выражений для вашего типа запроса.

    let urlRegEx = "((http(s)?:\\(/)\\/)|(\\/.*){1}"
    let string = "https://pixabay.com/en/art-beauty-fairytales-fantasy-2436545/"
    let matched = matches(for: urlRegEx, in: string)
    print(matched)

   func matches(for regex: String, in text: String) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex)
        let nsString = text as NSString
        let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
        return results.map { nsString.substring(with: $0.range)}
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
   }
0 голосов
/ 23 мая 2018

Вы можете использовать рег-EX

  let url = "http://www.somedomain.com/?f"
                let pattern = "^(http://|https://)[A-Za-z0-9.-]+(?!.*\\|\\w*$)"
                 let regex = try! NSRegularExpression.init(pattern: pattern, options: .caseInsensitive)
                let matches = regex.matches(in: url, options: [], range: NSMakeRange(0, url.count))

                matches.enumerated().forEach({ (_, match) in
                    print((url as NSString).substring(with: match.range))
                })
0 голосов
/ 23 мая 2018

Единственная возможность, которую я вижу, - это использовать URLComponents и вручную удалить некоторые компоненты:

let url = URL(string: "http://www.google.com/and/my/path")!
print(url)

var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
components.path = ""
print(components.url!) // http://www.google.com

Если вы решите создать URL-адрес вручную, вероятно, все же лучше использовать URLComponents для этого:

let url = URL(string: "http://www.google.com/and/my/path")!
var components = URLComponents()
components.scheme = url.scheme
components.host = url.host
print(components.url!)
...