У меня есть строка, которая состоит из одной предопределенной строки + случайные буквы, например "https://www.facebook.com/" и "userId".

У меня есть 3 предопределенные строки социального хоста:

let vkPredefinedHost = "https://vk.com/"
let fbPredefinedHost = "https://www.facebook.com/"
let instPredefinedHost = "https://www.instagram.com/"

Я хочу извлечь социальный идентификатор, который представляет собой строку, за которой следует эта строка (я не знаю точно, какой из них я получу).

Итак, мой вопрос:

1) Как проверить, содержит ли строка одну из этих строк, я предварительно определил

2) как извлечь строку, за которой следуют эти строки

Например, я получаю «https://www.instagram.com/myUserId12345» и хочу получить myUserId12345

2
Evgeniy Kleban 5 Сен 2017 в 11:01

6 ответов

Лучший ответ

Эти строки являются представлениями URL. Создайте URL и сравните host и получите path
например

let host = "www.instagram.com"

if let url = URL(string: "https://www.instagram.com/myUserId12345"),
    url.host == host {
    let userID = String(url.path.characters.dropFirst())
    print(userID)
}

Необходимо удалить первый символ (начальный слеш) с пути.

Вы даже можете написать

let userID = url.lastPathComponent

Если есть больше компонентов пути, и запрашиваемая информация является последней.

5
vadian 5 Сен 2017 в 08:32

Вы можете использовать встроенный RegEx в Swift:

let hostString = "Put your string here"

let pattern = "https:\/\/\w+.com\/(\w)" // any https://___.com/ prefix

let regex = try! NSRegularExpression(pattern: pat, options: [])

let match = regex.matchesInString(hostString, options: [], range: NSRange(location: 0, length: hostString.characters.count))

print(match[0]) // your social id
1
axelspark 5 Сен 2017 в 08:20

Попробуйте это расширение:

let instPredefinedHost = "https://www.instagram.com/"
let text = "https://www.instagram.com/myUserId12345"

extension String {

    func getNeededText(for host: String) -> String {
        guard range(of: host) != nil else { return "" }
        return replacingOccurrences(of: host, with: "")
    }

}

text.getNeededText(for: instPredefinedHost)
1
Vlad Khambir 5 Сен 2017 в 08:21

Вы можете использовать такой тип расширения:

extension String{
    func exclude(_ find:String) -> String {
        return replacingOccurrences(of: find, with: "", options: .caseInsensitive, range: nil)
    }
    func replaceAll(_ find:String, with:String) -> String {
        return replacingOccurrences(of: find, with: with, options: .caseInsensitive, range: nil)
    }
}

}

И использовать просто

let myaccount = fullString.exclude(find : instPredefinedHost)
0
nerowolfe 5 Сен 2017 в 08:10

Поскольку вы пытаетесь разобрать URL-адреса, зачем изобретать велосипед, когда Apple уже проделала тяжелую работу за вас с помощью URLComponents?

let myURLComps = URLComponents(string: "https://www.instagram.com/myUserId12345?test=testvar&test2=teststatic")

if let theseComps = myURLComps {

    let thisHost = theseComps.host
    let thisScheme = theseComps.scheme
    let thisPath = theseComps.path
    let thisParams = theseComps.queryItems

    print("\(thisScheme)\n\(thisHost)\n\(thisPath)\n\(thisParams)")
} 

Печатает :

Optional("https")
Optional("www.instagram.com")
/myUserId12345
Optional([test=testvar, test2=teststatic])
0
PruitIgoe 26 Июн 2018 в 10:45
  1. Вы можете использовать hasPrefix или contains для этого. но я думаю, что hasPrefix может быть лучшим.

    let instPredefinedHost = "https://www.instagram.com/" let userUrlString = "https://www.instagram.com/myUserId12345" let result = userUrlString.hasPrefix (instPredefinedHost) let result = userUrlString.contains (instPredefinedHost)

  2. можно использовать URL или отдельную строку

    let instPredefinedHost = "https://www.instagram.com/" let userUrl = URL (строка: userUrlString) let socialId = userUrl? .lastPathComponent let socialId = userUrlString.components (detaBy: instPredefinedHost) .last

1
cwwise 5 Сен 2017 в 08:29