1

UIWebView オブジェクトに HTML 文字列を表示する必要がある iOS アプリを構築します。検索してパターンを見つけ、画像への適切なリンクに置き換えようとしています。画像リンクは のようなオリジナルのもの[pic:brand:123]で、picは常にpicbrand任意の英数字にすること123ができ、 は空白以外の英数字にすることもできます。

これまでのところ、次のようないくつかを試しました。

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]])\\]";

しかし、これまでのところ、どれも機能していません。

サンプルコードは次のとおりです。

NSString *str = @"veryLongHTMLSTRING";
NSLog(@"Original test: %@",[str substringToIndex:500]);
NSError *error = nil;
// use regular expression to replace the emoji
NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@"\\[pic:([^\\s:\\]]+):([^\\]])\\]"
                                  options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
}else{
    [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             IMAGE_BASE_URL, @"$1/$2"]];

NSLog(@"Replaced test: %@",[str substringToIndex:500]);
4

2 に答える 2

8

2 つのエラーが表示されます+。正規表現パターンの 2 番目のキャプチャ グループに欠落があります。

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";

そして、新しい文字列stringByReplacingMatchesInStringを返します。一致した文字列を置き換えません。そのため、結果を新しい文字列に割り当てるか、.replaceMatchesInString:options:range:withTemplate:NSMutableString

次の変更されたコード

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
NSString *str = @"bla bla [pic:brand:123] bla bla";
NSLog(@"Original test: %@",str);
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:pattern
                              options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
} else{
    NSString *replaced = [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             @"IMAGE_BASE_URL", @"$1/$2"]];

    NSLog(@"Replaced test: %@",replaced);
}

出力を生成します

Original test: bla bla [pic:brand:123] bla bla
Replaced test: bla bla /IMAGE_BASE_URL/photo/brand/123.gif bla bla
于 2013-01-13T16:25:35.430 に答える
2

テンプレートの作成方法を誤解しています。また、stringByReplacingMatchesInString元の文字列を変更しません。これを試してください(テスト済み):

NSString *target = @"longHTML [pic:whatever:123] longHTMLcontinues";
NSMutableString *s = [target mutableCopy];

NSError *err = nil;
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:@"\\[pic\\:([a-zA-Z0-9]*)\\:([a-zA-Z0-9]*)\\]" options:0 error:&err];
if (err) {
    NSLog(@"%@", err);
    exit(-1);
}

[expr replaceMatchesInString:s options:0 range:NSMakeRange(0, s.length) withTemplate:@"/photo/$1/$2.gif"];
于 2013-01-13T16:30:38.163 に答える