0

基本上,我正在寻找一个使用 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。

4

1 回答 1

1

我从未使用过 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 很酷,如果要获取目标字符串的匹配范围,请不要工作。

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

@"<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])];
于 2012-03-12T10:06:00.663 回答