Соответствие HTML с NSRegularExpression - PullRequest
0 голосов
/ 12 марта 2012

В основном я ищу хороший пример сопоставления HTML (также с символами новой строки и пробелами), используя NSRegularExpression.

У меня есть этот код 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.

1 Ответ

1 голос
/ 12 марта 2012

Я никогда не использовал 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])];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...