URL 문자열을 구문 분석하여 키 값을 가져오는 가장 좋은 방법은 무엇입니까?
다음과 같은 URL 문자열을 구문 분석해야 합니다.
&ad_eurl=http://www.youtube.com/video/4bL4FI1Gz6s&hl=it_IT&iv_logging_level=3&ad_flags=0&endscreen_module=http://s.ytimg.com/yt/swfbin/endscreen-vfl6o3XZn.swf&cid=241&cust_gender=1&avg_rating=4.82280613104
NS 문자열을 다음과 같은 신호 부분으로 분할해야 합니다.cid=241그리고.&avg_rating=4.82280613104저는 이 일을 해왔습니다.substringWithRange:하지만 값이 랜덤 순서로 반환되므로 엉망이 됩니다.기본적으로 NSDictionary로 변환하여 키 값을 읽을 수 있는 쉬운 구문 분석을 허용하는 클래스가 있습니까(예: ValueForKey:cid돌아와야 합니다241) 또는 를 사용하는 것보다 더 쉽게 구문 분석할 수 있는 다른 방법이 있습니다.NSMakeRange서브스트링을 얻기 위해?
저도 https://stackoverflow.com/a/26406478/215748 에서 답변을 드렸습니다.
에서 사용할 수 있습니다.URLComponents.
이 속성의 값을 가져오면 NSURL 구성 요소 클래스는 쿼리 문자열을 구문 분석하고 원래 쿼리 문자열에 나타나는 순서대로 단일 키-값 쌍을 나타내는 NSURLQueryItem 개체의 배열을 반환합니다.
let url = "http://example.com?param1=value1¶m2=param2"
let queryItems = URLComponents(string: url)?.queryItems
let param1 = queryItems?.filter({$0.name == "param1"}).first
print(param1?.value)
또는 URL에 확장 기능을 추가하여 쉽게 사용할 수 있습니다.
extension URL {
var queryParameters: QueryParameters { return QueryParameters(url: self) }
}
class QueryParameters {
let queryItems: [URLQueryItem]
init(url: URL?) {
queryItems = URLComponents(string: url?.absoluteString ?? "")?.queryItems ?? []
print(queryItems)
}
subscript(name: String) -> String? {
return queryItems.first(where: { $0.name == name })?.value
}
}
그런 다음 이름으로 매개 변수에 액세스할 수 있습니다.
let url = URL(string: "http://example.com?param1=value1¶m2=param2")!
print(url.queryParameters["param1"])
편집 (2018년 6월): 이 답변이 더 좋습니다. iOS 7에 애플이 추가되었습니다.
사전을 만들고 키/값 쌍의 배열을 가져옵니다.
NSMutableDictionary *queryStringDictionary = [[NSMutableDictionary alloc] init];
NSArray *urlComponents = [urlString componentsSeparatedByString:@"&"];
그런 다음 사전을 채웁니다.
for (NSString *keyValuePair in urlComponents)
{
NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];
NSString *key = [[pairComponents firstObject] stringByRemovingPercentEncoding];
NSString *value = [[pairComponents lastObject] stringByRemovingPercentEncoding];
[queryStringDictionary setObject:value forKey:key];
}
다음으로 쿼리할 수 있습니다.
[queryStringDictionary objectForKey:@"ad_eurl"];
테스트되지 않은 오류 테스트를 몇 번 더 수행해야 합니다.
제가 조금 늦었지만, 지금까지 제공된 답변이 제가 필요한 만큼 작동하지 않았습니다.다음 코드 조각을 사용할 수 있습니다.
NSMutableDictionary *queryStrings = [[NSMutableDictionary alloc] init];
for (NSString *qs in [url.query componentsSeparatedByString:@"&"]) {
// Get the parameter name
NSString *key = [[qs componentsSeparatedByString:@"="] objectAtIndex:0];
// Get the parameter value
NSString *value = [[qs componentsSeparatedByString:@"="] objectAtIndex:1];
value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
queryStrings[key] = value;
}
어디에url구문 분석할 URL입니다.모든 쿼리 문자열이 이스케이프되어 있습니다.queryStrings가변 사전
편집: 빠른 버전:
var queryStrings = [String: String]()
if let query = url.query {
for qs in query.componentsSeparatedByString("&") {
// Get the parameter name
let key = qs.componentsSeparatedByString("=")[0]
// Get the parameter value
var value = qs.componentsSeparatedByString("=")[1]
value = value.stringByReplacingOccurrencesOfString("+", withString: " ")
value = value.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
queryStrings[key] = value
}
}
iOS8 이상의 경우 사용NSURLComponents:
+(NSDictionary<NSString *, NSString *> *)queryParametersFromURL:(NSURL *)url {
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
NSMutableDictionary<NSString *, NSString *> *queryParams = [NSMutableDictionary<NSString *, NSString *> new];
for (NSURLQueryItem *queryItem in [urlComponents queryItems]) {
if (queryItem.value == nil) {
continue;
}
[queryParams setObject:queryItem.value forKey:queryItem.name];
}
return queryParams;
}
아래 iOS 8의 경우:
+(NSDictionary<NSString *, NSString *> *)queryParametersFromURL:(NSURL *)url
NSMutableDictionary<NSString *, NSString *> * parameters = [NSMutableDictionary<NSString *, NSString *> new];
[self enumerateKeyValuePairsFromQueryString:url.query completionblock:^(NSString *key, NSString *value) {
parameters[key] = value;
}];
return parameters.copy;
}
- (void)enumerateKeyValuePairsFromQueryString:(NSString *)queryString completionBlock:(void (^) (NSString *key, NSString *value))block {
if (queryString.length == 0) {
return;
}
NSArray *keyValuePairs = [queryString componentsSeparatedByString:@"&"];
for (NSString *pair in keyValuePairs) {
NSRange range = [pair rangeOfString:@"="];
NSString *key = nil;
NSString *value = nil;
if (range.location == NSNotFound) {
key = pair;
value = @"";
}
else {
key = [pair substringToIndex:range.location];
value = [pair substringFromIndex:(range.location + range.length)];
}
key = [self decodedStringFromString:key];
key = key ?: @"";
value = [self decodedStringFromString:value];
value = value ?: @"";
block(key, value);
}
}
+ (NSString *)decodedStringFromString:(NSString *)string {
NSString *input = shouldDecodePlusSymbols ? [string stringByReplacingOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, string.length)] : string;
return [input stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
스위프트 5
extension URL {
func queryParams() -> [String:String] {
let queryItems = URLComponents(url: self, resolvingAgainstBaseURL: false)?.queryItems
let queryTuples: [(String, String)] = queryItems?.compactMap{
guard let value = $0.value else { return nil }
return ($0.name, value)
} ?? []
return Dictionary(uniqueKeysWithValues: queryTuples)
}
}
동일한 작업을 신속하게 수행하려면 확장 기능을 사용할 수 있습니다.
extension NSURL {
func queryDictionary() -> [String:String] {
let components = self.query?.componentsSeparatedByString("&")
var dictionary = [String:String]()
for pairs in components ?? [] {
let pair = pairs.componentsSeparatedByString("=")
if pair.count == 2 {
dictionary[pair[0]] = pair[1]
}
}
return dictionary
}
}
iOS 8부터 속성을 직접 사용할 수 있습니다.name그리고.value에NSURLQueryItem.
예: URL을 구문 분석하고 구문 분석된 쌍의 키에 대한 특정 값을 가져오는 방법.
NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:@"someURL" resolvingAgainstBaseURL:false];
NSArray *queryItems = urlComponents.queryItems;
NSMutableArray *someIDs = [NSMutableArray new];
for (NSURLQueryItem *item in queryItems) {
if ([item.name isEqualToString:@"someKey"]) {
[someIDs addObject:item.value];
}
}
NSLog(@"%@", someIDs);
사용 중인 경우NSURLComponents다음과 같은 간결한 확장자도 유용합니다.
extension NSURLComponents {
func getQueryStringParameter(name: String) -> String? {
return (self.queryItems? as [NSURLQueryItem])
.filter({ (item) in item.name == name }).first?
.value()
}
}
이 코드는 세 가지 경우에서 작동합니다.
1.http://www.youtube.com/watch?v=VWsl7C-y7EI&feature=youtu.be 2.http://youtu.be/lOvcFqQyaDY
3.http://www.youtube.com/watch?v=VWsl7C-y7EI
NSArray *arr = [youtubeurl componentsSeparatedByString:@"v="];
NSString *youtubeID;
if([arr count]>0)
{
if([arr count]==1){
youtubeID= [[youtubeurl componentsSeparatedByString:@"/"] lastObject];
}
else{
NSArray *urlComponents = [[arr objectAtIndex:1] componentsSeparatedByString:@"&"];
youtubeID=[urlComponents objectAtIndex:0];
}
}
-(NSArray *)getDataOfQueryString:(NSString *)url{
NSArray *strURLParse = [url componentsSeparatedByString:@"?"];
NSMutableArray *arrQueryStringData = [[NSMutableArray alloc] init];
if ([strURLParse count] < 2) {
return arrQueryStringData;
}
NSArray *arrQueryString = [[strURLParse objectAtIndex:1] componentsSeparatedByString:@"&"];
for (int i=0; i < [arrQueryString count]; i++) {
NSMutableDictionary *dicQueryStringElement = [[NSMutableDictionary alloc]init];
NSArray *arrElement = [[arrQueryString objectAtIndex:i] componentsSeparatedByString:@"="];
if ([arrElement count] == 2) {
[dicQueryStringElement setObject:[arrElement objectAtIndex:1] forKey:[arrElement objectAtIndex:0]];
}
[arrQueryStringData addObject:dicQueryStringElement];
}
return arrQueryStringData;
}
이 함수는 URL을 전달하기만 하면 쿼리 문자열의 모든 요소를 얻을 수 있습니다.
URL에 있는 Swift 3 확장자 형태의 이에 대한 늦은 해결책
extension URL {
func value(for paramater: String) -> String? {
let queryItems = URLComponents(string: self.absoluteString)?.queryItems
let queryItem = queryItems?.filter({$0.name == paramater}).first
let value = queryItem?.value
return value
}
}
전체 기능으로:
+ (NSString *)getQueryComponentWithName:(NSString *)name fromURL:(NSURL *)url{
NSString *component = nil;
if (url) {
NSString *query = url.query;
NSMutableDictionary *queryStringDictionary = [NSMutableDictionary dictionary];
NSArray *urlComponents = [query componentsSeparatedByString:@"&"];
for (NSString *keyValuePair in urlComponents){
NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];
NSString *key = [[pairComponents firstObject] stringByRemovingPercentEncoding];
NSString *value = [[pairComponents lastObject] stringByRemovingPercentEncoding];
[queryStringDictionary setObject:value forKey:key];
}
component = [queryStringDictionary objectForKey:name];
}
return component;
}
[self getQueryComponentWithName:@"example" fromURL:[NSURL URLWithString:@"https://google.es/?example=test"]];
쿼리 매개 변수를 딕트로 가져오는 방법
extension URL {
var parameters: [String: String] {
var parameters = [String: String]()
if let urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: false),
let queryItems = urlComponents.queryItems {
for queryItem in queryItems where queryItem.value != nil {
parameters[queryItem.name] = queryItem.value
}
}
return parameters
}
}
또는 선택사항을 반환합니다.
NSURL의 쿼리 속성은 쿼리 문자열을 제공합니다.그런 다음 구성 요소SeparatedByString을 사용하여 쿼리 문자열을 구문 분석할 수 있습니다.
NSArray *parameters = [[url query] componentsSeparatedByString:@"&"];
NSMutableDictionary *keyValuePairs = [NSMutableDictionary dictionary];
for (NSString *eachParam in parameters)
{
NSArray *QryParts = [eachParam componentsSeparatedByString:@"="];
if ( [QryParts count] == 2 )
{
keyValuePairs[QryParts[0]] = QryParts[1];
}
else
{
keyValuePairs[QryParts[0]] = QryParts[0];
}
}
NSString * name = [keyValuePairs valueForKey:@"name"];
NSString * username = [keyValuePairs valueForKey:@"username"];
- (NSString *)getLoginTokenFromUrl:(NSString *)urlString {
NSURL *url = [NSURL URLWithString:urlString];
NSArray *queryStrings = [url.query componentsSeparatedByString:@"&"];
NSMutableDictionary *queryParams = [[NSMutableDictionary alloc] init];
for (NSString *qs in queryStrings) {
// Get the parameter name
NSArray *components = [qs componentsSeparatedByString:@"="];
NSString *key = [components objectAtIndex:0];
// Get the parameter value
NSString *value;
if (components.count > 1) {
value = [components objectAtIndex:1];
}
else {
value = @"";
}
value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
queryParams[key] = value;
}
return [queryParams objectForKey:@"login_token"];
}
Swift 2 접근 방식:
extension NSURL {
var queryDictionary: [String: String] {
var queryDictionary = [String: String]()
guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false), queryItems = components.queryItems else { return queryDictionary }
queryItems.forEach { queryDictionary[$0.name] = $0.value }
return queryDictionary
}
}
언급URL : https://stackoverflow.com/questions/8756683/best-way-to-parse-url-string-to-get-values-for-keys
'programing' 카테고리의 다른 글
| 안드로이드에서 전화가 시작될 때 앱을 시작하려면 어떻게 해야 합니까? (0) | 2023.09.05 |
|---|---|
| C#을 사용하여 Oracle 데이터베이스에 BLOB 삽입 (0) | 2023.09.05 |
| SMTP를 사용하여 Python에서 메일 보내기 (0) | 2023.09.05 |
| MySQL 데이터베이스에 신용카드 정보를 저장하시겠습니까? (0) | 2023.09.05 |
| 아이폰으로 서버에 사진을 업로드하려면 어떻게 해야 합니까? (0) | 2023.09.05 |