【问题标题】:parsing a URL link into segments将 URL 链接解析为段
【发布时间】:2016-06-06 12:24:42
【问题描述】:
http://180.160.1.140/webapp/camera?id=fksmf84-8493-45u3

如何获取此网址部分fksmf84-8493-45u3?? -- 这部分在运行时会不断变化。

这是我迄今为止尝试过的。

NSString *url = @"http://180.160.1.140/webapp/camera?id=";
NSArray *parts = [url componentsSeparatedByString:@"="];
NSString *personID = [parts lastObject];
NSLog(@"My ID: %@", personID);

【问题讨论】:

  • 你看过我的回复了吗?

标签: ios nsstring nsurl


【解决方案1】:

使用 URL 组件:

对象:

NSString *urlString = "http://180.160.1.140/webapp/camera?id=fksmf84-8493-45u3";
NSURLComponents *components = [NSURLComponents componentsWithString:urlString];
NSArray *queryItems = components.queryItems;

for (NSURLQueryItem *queryItem in queryItems) {
    if ([queryItem.name isEqualToString:@"id"]) {
        NSLog(@"%@", queryItem.value);
        break;
    }
}

斯威夫特:

let urlComponents = NSURLComponents(string: "http://180.160.1.140/webapp/camera?id=fksmf84-8493-45u3")
let queryItems = urlComponents?.queryItems
if let id = queryItems?.filter({$0.name == "id"}).first?.value {
    print(id)
}

Swift 3(基本相同 - NS):

let urlComponents = URLComponents(string: "http://180.160.1.140/webapp/camera?
id=fksmf84-8493-45u3")
let queryItems = urlComponents?.queryItems
if let id = queryItems?.filter({$0.name == "id"}).first?.value {
    print(id)
}

【讨论】:

  • 点赞! .这是比我的回答更好的方法。使用 NSURLQueryItem 类:)
  • 更好的方法+1
【解决方案2】:

要解析所有键值对并将它们作为字典获取,您可以使用-parseQueryString: 方法。

你可以像这样解析你的查询字符串...

   {
    //...
    NSString * urlQuery              = [url query];
    NSDictionary *dict = [self parseQueryString:urlQuery];
    NSString * valueForID = dict["id"];
    //...
    }
    // Waring : Its just a prototype, at production this might need safety checks.
    - (NSDictionary *)parseQueryString:(NSString *)query
    {
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
        NSArray *pairs = [query componentsSeparatedByString:@"&"];

        for (NSString *pair in pairs)
        {
            NSArray *elements = [pair componentsSeparatedByString:@"="];
            NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

            [dict addObject:val forKey:key];
        }
        return dict;
    }

更新:如果目标 iOS 版本高于 7,请查看 Richmond Watkins 的回答。为相同目的添加了新的 api,检查NSURLQueryItem

【讨论】:

    【解决方案3】:

    见:

    NSString *url = @"http://180.160.1.140/webapp/camera?id=fksmf84-8493-45u3"; // you forgot to add the id in your test case
    NSArray *parts = [url componentsSeparatedByString:@"="];
    NSString *personID = [parts lastObject];
    NSLog(@"My ID: %@", personID);
    

    输出:我的ID:fksmf84-8493-45u3

    编辑:

    存储数据:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    [defaults setObject:personID forKey:@"personID"];
    

    读取数据:

     NSString *personID = [defaults objectForKey:@"personID"];
    

    使用此方法,您可以轻松获取上次运行的值。希望这会对你有所帮助:)。

    【讨论】:

    • 但是 fksmf84-8493-45u3 那部分一直在变化。无论如何都可以用作首字母吗? @Masterfego
    • 那你想要什么?只是拿身份证或其他东西?
    • 只想参加这部分 fksmf84-8493-45u3 但这些字母和数字一直在变化,因此不稳定。下次可以是jdfsfmsf-0000-78h6。 @Masterfego 这个还在用吗?我想让它动态化。
    • @Dicle 除非它不包含您拆分字符串的字符,即'=',否则它会很好。就像 id 是“fksmf84-8493=45u3”一样,这会给你“45u3”。您必须确保此 ID 不包含“=”。
    • 我认为你并没有真正解释你想要什么。请解释得很好。主题与您想要的不同。您想保存此 ID 以供其他用途吗?
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2012-04-11
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多