NSString componentsSeparatedByString“&”但忽略“& amp;”

时间:2012-04-30 20:16:14

标签: objective-c ios nsstring ignore

需要在&上分隔字符串,而不是&上的字符串。

是否有更优雅的方式对其进行编码而不是先替换它然后在&上将其分开?像这样......

query = [query stringByReplacingOccurrencesOfString:@"&" withString:@"~~~"];
NSArray * kvpairs = [query componentsSeparatedByString:@"&"];

NSMutableArray *mArr = [[NSMutableArray alloc] init];
for (NSString *kvp in kvpairs) {
    [mArr addObject:[kvp stringByReplacingOccurrencesOfString:@"~~~" withString:@"&"]];
}
kvpairs = [NSArray arrayWithArray:mArr];
[mArr release];

3 个答案:

答案 0 :(得分:3)

您可以使用NSRegularExpression枚举匹配&但不匹配&的正则表达式上的字符串,例如:@"&(?!amp;)"。这将比您当前的方法更麻烦,但更准确,因为它可以在不修改原始字符串的情况下工作,并且不依赖于标记值。

如果您控制此方法的输入并且可以保证~~~不会正常显示,则使用~~~没有任何问题。但是,如果您控制输入,那么您应该尝试解析字符串而不进行修改。

答案 1 :(得分:1)

这没有任何问题,只要您100%确定查询中不会出现字符串~~~

如果不是,我的下一步是实现一个方法将字符串解析为数组。在这种方法中,您可以找到每个&,然后检查它是否后跟amp;。如果是,则转到下一个,如果不是,则在那里剪切字符串并重复。

答案 2 :(得分:0)

HTML实体和引用在URL中闲置并不是一件好事。除非非常有充分理由认为HTML实体必须,否则我建议在URL编码&符号中使用'%26'。

话虽如此,如果'&'你会遇到问题不是唯一的HTML实体或引用,所以除非你绝对确定'&'是唯一一个,你需要一个更强大的解决方案。