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 に答える