基本上,我正在寻找一个使用NSRegularExpression匹配HTML(以及换行符和空格)的好示例。

我有一段时间写的这个PHP代码:

preg_match_all("/<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>/si",       $data, $m['deets']);


现在,我知道这在PHP中有效,但是对于我一生来说,我无法将其转换为Objective-C。这是我的尝试。

NSRegularExpression *regex  = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>" options:(NSRegularExpressionCaseInsensitive) error:&error];
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])];


在这种情况下,我的目标是一堆HTML。

最佳答案

我从未使用过NSRegularExpression,而是使用NSPredicate:

NSError *error = NULL;
NSString* pattern = @"/<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>/si";

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
if ([predicate evaluateWithObject:myTargetString] == YES) {
  // Okay
} else {
  // Not found
}


希望这可以帮助。

编辑:

NSPredicate很酷,如果要获取目标字符串的匹配范围,请不要使用。

您的代码是正确的,但是问题来自regexp表达式,您必须转义\字符而不是转义/。

@"<dt>(.+?)</dt>\\W+<dd>(.+?)</dd>"


因此:

NSRegularExpression *regex  = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)</dt>\\W+<dd>(.+?)</dd>" options:(NSRegularExpressionCaseInsensitive) error:&error];
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])];

关于iphone - 将HTML与NSRegularExpression匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9664699/

10-11 22:20
查看更多