2009-12-27 8 views
12

क्या एनएसआरएल के घटकों को पार्स करने के लिए कोई मानक वस्तुएं या कार्य हैं? स्पष्ट रूप से मैं एक लिख सकता था, लेकिन पहिया का फिर से आविष्कार क्यों किया?पार्स एनएसआरएल पथ और क्वेरी (आईफोनओएस)

[NSURL path] एक NSString"argX=x&argY=y&argZ=z" तरह क्या मैं नहीं बल्कि वापस मिल जाएगा वापस आ जाएगी एक शब्दकोश {@"argX" => @"x", @"argY" => @"y", @"argZ" = @"z"}

पथ के लिए है, जो इस तरह की स्ट्रिंग रिटर्न के साथ आबादी है "/ Partã/partB/partC", मैं नहीं बल्कि मिलेगा संरचना {[0] => @"partA", [1] => @"partB", [2] => @"partC"}

मुझे पता है यह एक बहुत विशिष्ट पूछना है, लेकिन यह कुछ बहुत से लोगों को चाहेगा की तरह लगता है के साथ एक सरणी ...

संपादित करें - यह iPhoneOS के लिए है! जाहिर है NSURL आप लिखने के लिए एक (मुझे यकीन है कि वहाँ घटकों आप चाहते हैं होने का मौजूदा तरीके हैं नहीं कर रहा हूँ) का फैसला करते हैं मैक ओएस

+0

अच्छा सवाल। क्या आपका मतलब है: यदि यूआरएल "/ partA/partB/partC" है, तो आप "0 => partA, 1 => partB, 2 => partC" चाहते हैं। यदि यूआरएल "/ foo? PartA = ए और partB = B" आप चाहते हैं "partA => ए, partB => B"। क्या होगा अगर यूआरएल "/ partA/partB/partC? Foo = bar और ooga = booga" है? एक उदाहरण में, प्रश्न में इकाई की पहचान करने के लिए आवश्यक महत्वपूर्ण जानकारी एक क्वेरी स्ट्रिंग में पारित की जा रही है ... दूसरे उदाहरण में, पहचानने वाली जानकारी पथ में आराम-शैली को पारित कर दी जाती है। –

+0

मेरा मतलब है कि मैं पथ और क्वेरी को अलग से पार्स करना चाहता हूं। यह एक ऐसा कार्य नहीं होना चाहिए जो उन दो कार्यों को जोड़ता है। स्पष्टीकरण के लिए नीचे दिए गए कोड को देखें। अगर कोई मौजूदा कार्यान्वयन के साथ जवाब देता है, तो मुझे अभी भी इसे स्वीकार करने में खुशी होगी। – DougW

+0

ध्यान में रखना एक बात यह है कि यह एक पूरी तरह से मान्य क्वेरी स्ट्रिंग है: "x = 1 और x = 0 और x = foo", इसलिए एक NSDictionary सबसे अच्छा प्रतिनिधित्व नहीं हो सकता है (जब तक कि आप मानों के रूप में सरणी का उपयोग नहीं कर रहे हों)। – n8gray

उत्तर

9

आप pathComponents पर देख सकते हैं जो यूआरएल के घटकों की एक श्रृंखला देता है। अधिक जानकारी प्राप्त करें here

+0

मुझे विश्वास नहीं है कि यह एसडीके के आईफोन संस्करण पर उपलब्ध है। मुझे यह स्पष्ट करना चाहिए था कि मैं आईफोन ओएस पर काम कर रहा हूं। – DougW

+2

[एनएसएसटींग पथकंपोनेंट्स] कोको और कोको टच एपीआई दोनों में उपलब्ध है। आईफोन पर, आप ओएस एक्स 10.6 के [NSURL पथकंपोनेंट्स] [[NSURL पथ] पथकंपोनेंट्स] के साथ अनुकरण कर सकते हैं। –

+0

आह सही, कम से कम पथ भाग के लिए, मैं यही खोज रहा था! – DougW

2

पर विभिन्न कार्यों है, तो आपको NSString के componentsSeparatedByString उपयोग करने के लिए चाहते हो सकता है।

+0

धन्यवाद, मुझे थोड़ा सा काम बचाया! – DougW

12

ठीक है, मुझे चींटी मिली और श्रेणियों के माध्यम से एनएसएसटींग को विस्तारित करने के लिए एक समाधान लिखा। मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन यदि आप इसका उपयोग करना चाहते हैं, तो इसके लिए जाएं।

@interface NSString (ParseCategory) 
- (NSMutableDictionary *)explodeToDictionaryInnerGlue:(NSString *)innerGlue outterGlue:(NSString *)outterGlue; 
@end 

@implementation NSString (ParseCategory) 

- (NSMutableDictionary *)explodeToDictionaryInnerGlue:(NSString *)innerGlue outterGlue:(NSString *)outterGlue { 
    // Explode based on outter glue 
    NSArray *firstExplode = [self componentsSeparatedByString:outterGlue]; 
    NSArray *secondExplode; 

    // Explode based on inner glue 
    NSInteger count = [firstExplode count]; 
    NSMutableDictionary *returnDictionary = [NSMutableDictionary dictionaryWithCapacity:count]; 
    for (NSInteger i = 0; i < count; i++) { 
     secondExplode = [(NSString *)[firstExplode objectAtIndex:i] componentsSeparatedByString:innerGlue]; 
     if ([secondExplode count] == 2) { 
      [returnDictionary setObject:[secondExplode objectAtIndex:1] forKey:[secondExplode objectAtIndex:0]]; 
     } 
    } 

    return returnDictionary; 
} 

@end 

यह इस तरह कहा जाता है:

NSMutableDictionary *parsedQuery = [[myNSURL query] explodeToDictionaryInnerGlue:@"=" [email protected]"&"] 

NSURL के रास्ते भाग पार्स करने के लिए (यानी @ "/ Partã/partB/partC"), सिर्फ इस फोन:

NSArray *parsedPath = [[nyNSURL path] componentsSeperatedByString:@"/"]; 

ध्यान रखें कि पार्सडपाथ [0] अग्रणी/की वजह से एक खाली स्ट्रिंग होगी!

EDIT - यहां आपके उपयोग की खुशी के लिए NSURL का एक श्रेणी विस्तार है। यह प्रारंभिक "/" स्ट्रिप्स करता है ताकि आपके पास खाली 0 अनुक्रमणिका न हो।

@implementation NSURL (ParseCategory) 

- (NSArray *)pathArray { 
    // Create a character set for the slash character 
    NSRange slashRange; 
    slashRange.location = (unsigned int)'/'; 
    slashRange.length = 1; 
    NSCharacterSet *slashSet = [NSCharacterSet characterSetWithRange:slashRange]; 

    // Get path with leading (and trailing) slashes removed 
    NSString *path = [[self path] stringByTrimmingCharactersInSet:slashSet]; 

    return [path componentsSeparatedByCharactersInSet:slashSet]; 
} 

- (NSDictionary *)queryDictionary { 
    NSDictionary *returnDictionary = [[[[self query] explodeToDictionaryInnerGlue:@"=" outterGlue:@"&"] copy] autorelease]; 
    return returnDictionary; 
} 

@end 
+0

यह सुनिश्चित नहीं है कि किसी ने इसे क्यों वोट दिया है ... जो मुझे लगता है कि कोड साझा करने के लिए मुझे सिखाएगा? यदि आप कोई टिप्पणी छोड़ देते हैं तो मुझे वास्तव में बुरा नहीं लगेगा, लेकिन मुझे लगता है कि आप एक यादृच्छिक ट्रोल हैं। हाय ट्रोल – DougW

+4

धन्यवाद, यह मेरे लिए ठीक काम करता है।ध्यान दें कि आपको अपने व्यक्तिगत क्वेरी स्ट्रिंग मानों को यूआरएल-डीकोड करने की आवश्यकता हो सकती है। मैं इसके लिए निम्न कोड का उपयोग कर रहा हूं, पहले प्रतिशत-भागने का ख्याल रखने के लिए, फिर अंतरिक्ष के साथ "+" को प्रतिस्थापित करने के लिए, जो दुर्भाग्य से पहला नहीं करता है: [[value stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding] stringByReplacingOccurrencesOfString: @ "+ "withString: @" "] –

+0

बहुत स्वागत है। और हाँ, मैंने इन कार्यों में से एन्कोडिंग/डिकोडिंग के मामलों को छोड़ दिया। – DougW

11

सैम सॉफ ने NSURL/NSDictionary के लिए एक अच्छी तरह से बनाए रखा श्रेणी बनाई। यह यहां पाया जा सकता: https://github.com/samsoffes/sstoolkit/

+0

अच्छा खोज। सुपर सहायक धन्यवाद दोस्त। – courtsimas

+0

सुपर कमाल लाइब्रेरी, – Tony

5

Heres क्या मैं क्वेरी स्ट्रिंग

// Parse the individual parameters 
// parameters = @"hello=world&foo=bar"; 
NSMutableDictionary *dictParameters = [[NSMutableDictionary alloc] init]; 
NSArray *arrParameters = [parameters componentsSeparatedByString:@"&"]; 
for (int i = 0; i < [arrParameters count]; i++) { 
    NSArray *arrKeyValue = [[arrParameters objectAtIndex:i] componentsSeparatedByString:@"="]; 
    if ([arrKeyValue count] >= 2) { 
     NSMutableString *strKey = [NSMutableString stringWithCapacity:0]; 
     [strKey setString:[[[arrKeyValue objectAtIndex:0] lowercaseString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 
     NSMutableString *strValue = [NSMutableString stringWithCapacity:0]; 
     [strValue setString:[[[arrKeyValue objectAtIndex:1] stringByReplacingOccurrencesOfString:@"+" withString:@" "] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; 
     if (strKey.length > 0) [dictParameters setObject:strValue forKey:strKey]; 
    } 
} 
NSLog(@"Parameters: %@", dictParameters); 
2

iOS 8 और ओएस एक्स 10.10 में प्रस्तुत NSURLQueryItem है, जिन तक प्रश्नों के निर्माण के लिए इस्तेमाल किया जा सकता पार्स करने के लिए उपयोग करें। NSURLQueryItem पर डॉक्स से:

एक NSURLQueryItem वस्तु एक यूआरएल की क्वेरी भाग में एक आइटम के लिए एक एकल नाम/मान युग्म प्रतिनिधित्व करता है। आप NSRLComponents ऑब्जेक्ट की क्वेरी इटम्स संपत्ति के साथ क्वेरी आइटम का उपयोग करते हैं।

आप पहली बार NSURLComponents बनाने के द्वारा एक URL से क्वेरी आइटम प्राप्त कर सकते हैं:

NSURL *url = [NSURL URLWithString:@"http://stackoverflow.com?q=ios&count=10"]; 
NSURLComponents *components = [NSURLComponents componentsWithURL:url 
               resolvingAgainstBaseURL:YES]; 
for (NSURLQueryItem *item in components.queryItems) { 
    NSLog(@"name: %@, value: %@", item.name, item.value); 
} 
// name: q, value: ios 
// name: count, value: 10 

ध्यान दें कि वे -queryItems के लिए मान एक सरणी, नहीं एक शब्दकोश है। ऐसा इसलिए है क्योंकि निम्नलिखित एक मान्य यूआरएल है। दो समान "कुंजी", foo पर ध्यान दें।

http://google.com?foo=bar&foo=baz

क्वेरी आइटम के माध्यम से एक यूआरएल बनाने के लिए, नामित प्रारंभकर्ता queryItemWithName:value: का उपयोग करें और फिर उन्हें NSURLComponents में जोड़ने के लिए एक NSURL उत्पन्न करने के लिए। उदाहरण के लिए:

NSString *urlString = @"http://stackoverflow.com"; 
NSURLComponents *components = [NSURLComponents componentsWithString:urlString]; 
NSURLQueryItem *search = [NSURLQueryItem queryItemWithName:@"q" value:@"ios"]; 
NSURLQueryItem *count = [NSURLQueryItem queryItemWithName:@"count" value:@"10"]; 
components.queryItems = @[ search, count ]; 
NSURL *url = components.URL; // http://stackoverflow.com?q=ios&count=10 

ध्यान दें कि प्रश्न चिह्न और एम्परसांड स्वचालित रूप से संभाले जाते हैं।

NSDictionary *queryDictionary = @{ @"q": @"ios", @"count": @"10" }; 
NSMutableArray *queryItems = [NSMutableArray array]; 
for (NSString *key in queryDictionary) { 
    NSURLQueryItem *item = [NSURLQueryItem queryItemWithName:key 
                 value:queryDictionary[key]]; 
    [queryItems addObject:item]; 
} 
components.queryItems = queryItems; 

मैं भी अधिक विवरण के साथ एक ब्लॉग पोस्ट, Building NSURLs with NSURLQueryItems लिखा है: मानकों का एक शब्दकोश से एक NSURL बनाने के रूप में सरल रूप में है।

+0

को इंगित करने के लिए धन्यवाद कूल! देवताओं के लिए बस एक नोट - यदि आप डुप्लिकेट जीईटी पैरामीटर का उपयोग करते हैं तो आप चोट की दुनिया में हैं। उनको संभालने के लिए कोई परिभाषित स्पेक नहीं है, और विभिन्न भाषाओं/प्लेटफॉर्म अपने स्वयं के नियम बनाते हैं। Http://stackoverflow.com/questions/1746507/authoritative-position-of-duplicate-http-get-query-keys देखें – DougW

संबंधित मुद्दे