2009-07-01 13 views
22

次の形式のURL文字列があります。&をObjective-Cに変換する

http://myserver.com/_layouts/feed.aspx?xsl=4&web=%2F&page=dda3fd10-c776-4d69-8c55-2f1c74b343e2&wp=476f174a-82df-4611-a3df-e13255d97533

私は上記のURLに&&を交換したいです。私の結果は次のようになります。

http://myserver.com/_layouts/feed.aspx?xsl=4&web=%2F&page=dda3fd10-c776-4d69-8c55-2f1c74b343e2&wp=476f174a-82df-4611-a3df-e13255d97533

誰かが私にこれを成し遂げるためのコードを投稿することができますか?

おかげ

答えて

14
[urlString stringByReplacingOccurrencesOfString:@"&" withString:@"&"]; 
+0

比較的簡単なはず...しかしに任意の組み込み方法はありこれをやろう... – nbojja

+2

@nbojjaどのくらい組み込みたいですか? NSStringのカテゴリとしてこれを行うメソッドを追加してから組み込みます。 – Abizern

+10

@Abizern:多くの言語には、HTMLエンティティのエンコードとデコードのための組み込みメソッドがあり、Obj-Cにはこれと他の多くの機能がありませんプログラマーは2002年以来、当然のことです。検索と置換は、あなたがすべてのエンティティを取得するのにかなりの時間を費やす必要があるため、貧弱な代替物です。 –

8

iPhone SDKで、このための組み込み関数はありません。機能が必要なのはfile a bugです。通常のMac OS X SDKでは、フラグメントをNSAttributedStringにHTMLとしてロードしてプレーンストリングを返すか、またはCFXMLCreateStringByUnescapingEntities()を使用するかを尋ねることができます。

@interface NSString (LGAdditions) 
- (NSString *) stringByUnescapingEntities; 
@end 

@implementation NSString (LGAdditions) 
- (NSString *) stringByUnescapingEntities { 
    CFStringRef retvalCF = CFXMLCreateStringByUnescapingEntities(kCFAllocatorDefault, (CFStringRef)self, NULL); 
    return [NSMakeCollectable(retvalCF) autorelease]; 
} 
@end 
+0

自動参照カウント(ARC)で動作しません。{sigh} – mpemburn

+0

@mpemburnしようとしました: 'CFStringRef retvalCF = CFXMLCreateStringByUnescapingEntities(kCFAllocatorDefault、(__bridge CFAllocatorRef)self、NULL); return(NSString *)CFBridgingRelease(retvalCF); ' –

+0

CFAllocatorRefではなく、CFStringRefに橋渡しされるべきです。元のコードリストでは間違っていました。 – dgatwood

113

私のNSString category for HTMLをチェックしてください。利用可能な方法は次のとおりです。

// Strips HTML tags & comments, removes extra whitespace and decodes HTML character entities. 
- (NSString *)stringByConvertingHTMLToPlainText; 

// Decode all HTML entities using GTM. 
- (NSString *)stringByDecodingHTMLEntities; 

// Encode all HTML entities using GTM. 
- (NSString *)stringByEncodingHTMLEntities; 

// Minimal unicode encoding will only cover characters from table 
// A.2.2 of http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters 
// which is what you want for a unicode encoded webpage. 
- (NSString *)stringByEncodingHTMLEntities:(BOOL)isUnicode; 

// Replace newlines with <br /> tags. 
- (NSString *)stringWithNewLinesAsBRs; 

// Remove newlines and white space from string. 
- (NSString *)stringByRemovingNewLinesAndWhitespace; 
+0

これはありがとう、マイケル - 非常に便利です! (受け入れられたこの質問に対する答えが間違っているので便利です!) –

+0

問題はありません;)うれしいことがわかりました! –

+0

はい、非常に便利です、ありがとうマイケル – Jack

4

iOSの場合、次のコードは数値コードで使用できます。私が同じことをやった... &amp; ...

-(NSString*)unescapeHtmlCodes:(NSString*)input { 

NSRange rangeOfHTMLEntity = [input rangeOfString:@"&#"]; 
if(NSNotFound == rangeOfHTMLEntity.location) { 
    return input; 
} 


NSMutableString* answer = [[NSMutableString alloc] init]; 
[answer autorelease]; 

NSScanner* scanner = [NSScanner scannerWithString:input]; 
[scanner setCharactersToBeSkipped:nil]; // we want all white-space 

while(![scanner isAtEnd]) { 

    NSString* fragment; 
    [scanner scanUpToString:@"&#" intoString:&fragment]; 
    if(nil != fragment) { // e.g. '&#38; B' 
     [answer appendString:fragment];   
    } 

    if(![scanner isAtEnd]) { // implicitly we scanned to the next '&#' 

     int scanLocation = (int)[scanner scanLocation]; 
     [scanner setScanLocation:scanLocation+2]; // skip over '&#' 

     int htmlCode; 
     if([scanner scanInt:&htmlCode]) { 
      char c = htmlCode; 
      [answer appendFormat:@"%c", c]; 

      scanLocation = (int)[scanner scanLocation]; 
      [scanner setScanLocation:scanLocation+1]; // skip over ';' 

     } else { 
      // err ? 
     } 
    } 

} 

return answer; 

} 

の同類にいくつかのユニットテストコードを拡張する

-(void)testUnescapeHtmlCodes { 

NSString* expected = @"A & B"; 
NSString* actual = [self unescapeHtmlCodes:@"A &#38; B"]; 
STAssertTrue([expected isEqualToString:actual], @"actual = %@", actual); 

expected = @"& B"; 
actual = [self unescapeHtmlCodes:@"&#38; B"];  
STAssertTrue([expected isEqualToString:actual], @"actual = %@", actual); 

expected = @"A &"; 
actual = [self unescapeHtmlCodes:@"A &#38;"]; 
STAssertTrue([expected isEqualToString:actual], @"actual = %@", actual); 

} 
関連する問題