iphone - spec - whatwg español
Conversión y amp; a & en Objective-C (4)
Esta pregunta ya tiene una respuesta aquí:
- Objective C HTML escape / unescape 14 respuestas
Tengo una cadena de URL en el siguiente formato.
http://myserver.com/_layouts/feed.aspx?xsl=4&web=%2F&page=dda3fd10-c776-4d69-8c55-2f1c74b343e2&wp=476f174a-82df-4611-a3df-e13255d97533
Quiero reemplazar &
con &
en la URL anterior. Mi resultado debería ser:
http://myserver.com/_layouts/feed.aspx?xsl=4&web=%2F&page=dda3fd10-c776-4d69-8c55-2f1c74b343e2&wp=476f174a-82df-4611-a3df-e13255d97533
¿Alguien puede enviarme el código para hacer esto?
Gracias
Mira mi categoría NSString para HTML . Aquí están los métodos disponibles:
// 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;
No hay una función incorporada para esto en el iPhone SDK. Debes presentar un error para que desees la funcionalidad. En el SDK de Mac OS X normal, puede cargar el fragmento en un NSAttributedString como HTML y pedirle que devuelva una cadena simple, o usar CFXMLCreateStringByUnescapingEntities() .
@interface NSString (LGAdditions)
- (NSString *) stringByUnescapingEntities;
@end
@implementation NSString (LGAdditions)
- (NSString *) stringByUnescapingEntities {
CFStringRef retvalCF = CFXMLCreateStringByUnescapingEntities(kCFAllocatorDefault, (CFStringRef)self, NULL);
return [NSMakeCollectable(retvalCF) autorelease];
}
@end
Para iOS, el siguiente código debería funcionar para códigos numéricos. Debería ser relativamente fácil extenderse a los gustos de &
...
-(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. ''& 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;
}
Algún código de prueba de unidad ...
-(void)testUnescapeHtmlCodes {
NSString* expected = @"A & B";
NSString* actual = [self unescapeHtmlCodes:@"A & B"];
STAssertTrue( [expected isEqualToString:actual], @"actual = %@", actual );
expected = @"& B";
actual = [self unescapeHtmlCodes:@"& B"];
STAssertTrue( [expected isEqualToString:actual], @"actual = %@", actual );
expected = @"A &";
actual = [self unescapeHtmlCodes:@"A &"];
STAssertTrue( [expected isEqualToString:actual], @"actual = %@", actual );
}
[urlString stringByReplacingOccurrencesOfString:@"&" withString:@"&"];