Basicamente eu estou procurando um bom exemplo de correspondência HTML (também novas linhas e espaços em branco) usando NSRegularExpression.
Eu tenho este código PHP que escrevi um tempo atrás:
preg_match_all("/<dt>(.+?)</dt>W+<dd>(.+?)</dd>/si", $data, $m["deets"]);
Agora eu sei que isso funciona em PHP, mas para a vida de mim eu não posso traduzi-lo para Objective-C. Aqui foi a minha tentativa.
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)</dt>W+<dd>(.+?)</dd>" options:(NSRegularExpressionCaseInsensitive) error:&error];
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])];
Meu alvo nesse caso é um monte de HTML.
Respostas:
1 para resposta № 1Eu nunca usei NSRegularExpression, mas NSPredicate em vez disso:
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
}
Espero que isto ajude.
EDITAR:
NSPredicate é legal, não trabalhe se você quiser obter o intervalo correspondente de sua string de destino.
Seu código está certo, mas o problema vem da expressão regexp, você deve escapar de seus personagens e não escapar / ones.
@"<dt>(.+?)</dt>\W+<dd>(.+?)</dd>"
Assim :
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)</dt>\W+<dd>(.+?)</dd>" options:(NSRegularExpressionCaseInsensitive) error:&error];
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])];