Regex 解析cocoa中的URL

Regex 解析cocoa中的URL,regex,cocoa,parsing,url,Regex,Cocoa,Parsing,Url,URL是:http://oauth.vk.com/blank.html#access_token=244832666b8168a3mna06f03f5324789a8022455245532b032375f193ceab923&expires_in=86400&user_id=191742 如何在Cocoa中解析它并获取访问令牌和用户id?有一个用于解析URL的类:。如果这还不够,您可以使用NSString类的方法获取参数。有一个用于解析URL的类:。如果这还不够,您可以使用NSString类的

URL是:
http://oauth.vk.com/blank.html#access_token=244832666b8168a3mna06f03f5324789a8022455245532b032375f193ceab923&expires_in=86400&user_id=191742


如何在Cocoa中解析它并获取
访问令牌
用户id

有一个用于解析URL的类:。如果这还不够,您可以使用NSString类的方法获取参数。

有一个用于解析URL的类:。如果这还不够,您可以使用NSString类的方法获取参数。

-fragment
NSURL
方法返回
后面的字符串

这就是它的用途。它非常基本,不支持实体(如
&;
),它只是将字符串按
&
拆分,然后按
=
拆分

@interface NSURL (SYBasicKeyValueParsing)
- (NSDictionary *)sy_keysAndValuesOfString:(NSString *)string;
- (NSDictionary *)sy_keysAndValuesOfFragment;
- (NSDictionary *)sy_keysAndValuesOfQuery;
@end

@implementation NSURL (SYBasicKeyValueParsing)

- (NSDictionary *)sy_keysAndValuesOfString:(NSString *)string
{
    if (!string) return nil;

    NSMutableDictionary *result = [NSMutableDictionary dictionary];

    for (NSString *pair in [string componentsSeparatedByString:@"&"]) {
        NSArray *keyAndValue = [pair componentsSeparatedByString:@"="];
        if ([keyAndValue count] == 2) {
            [result setObject:[keyAndValue objectAtIndex:1] forKey:[keyAndValue objectAtIndex:0]];
        }
    }
    return [[result copy] autorelease];
}

- (NSDictionary *)sy_keysAndValuesOfFragment
{
    return [self sy_keysAndValuesOfString:[self fragment]];
}

- (NSDictionary *)sy_keysAndValuesOfQuery
{
    return [self sy_keysAndValuesOfString:[self query]];
}

@end
因此,URL的
sy_key和valuesoffragment
将导致:

{
    "access_token" = 244832666b8168a3mna06f03f5324789a8022455245532b032375f193ceab923;
    "expires_in" = 86400;
    "user_id" = 191742;
}

NSURL
-fragment
方法返回
#
后面的字符串

这就是它的用途。它非常基本,不支持实体(如
&;
),它只是将字符串按
&
拆分,然后按
=
拆分

@interface NSURL (SYBasicKeyValueParsing)
- (NSDictionary *)sy_keysAndValuesOfString:(NSString *)string;
- (NSDictionary *)sy_keysAndValuesOfFragment;
- (NSDictionary *)sy_keysAndValuesOfQuery;
@end

@implementation NSURL (SYBasicKeyValueParsing)

- (NSDictionary *)sy_keysAndValuesOfString:(NSString *)string
{
    if (!string) return nil;

    NSMutableDictionary *result = [NSMutableDictionary dictionary];

    for (NSString *pair in [string componentsSeparatedByString:@"&"]) {
        NSArray *keyAndValue = [pair componentsSeparatedByString:@"="];
        if ([keyAndValue count] == 2) {
            [result setObject:[keyAndValue objectAtIndex:1] forKey:[keyAndValue objectAtIndex:0]];
        }
    }
    return [[result copy] autorelease];
}

- (NSDictionary *)sy_keysAndValuesOfFragment
{
    return [self sy_keysAndValuesOfString:[self fragment]];
}

- (NSDictionary *)sy_keysAndValuesOfQuery
{
    return [self sy_keysAndValuesOfString:[self query]];
}

@end
因此,URL的
sy_key和valuesoffragment
将导致:

{
    "access_token" = 244832666b8168a3mna06f03f5324789a8022455245532b032375f193ceab923;
    "expires_in" = 86400;
    "user_id" = 191742;
}

+1、不要忘记使用
-[NSString stringByReplacingPercentEscapesUsingEncoding:][/code>@DaveDeLong对键和值进行URL解码谢谢您的评论!我真的忘记了这一点,但是因为我在这种情况下使用解析器就像OP的一样([\u a-z0-9]=[\u a-z0-9]),编码不是问题。+1,只是不要忘记使用
-[NSString stringbyreplacingpercentescapesusingencode:
@DaveDeLong对键和值进行URL解码。谢谢你的评论!我真的忘记了这一点,但由于我在类似OP的情况下使用解析器([\u a-z0-9]=[\u a-z0-9]),所以编码不是问题。