2013-10-02 4 views
0

Попытки удалить все адреса из текста:NSString не переписывает с новым значением

- (NSString *)cleanText:(NSString *)text{ 
    NSString *string = @"This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it."; 
    NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil]; 
    NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])]; 

    for (NSTextCheckingResult *match in matches) { 
     if ([match resultType] == NSTextCheckingTypeLink) { 
      NSString *matchingString = [match description]; 
      NSLog(@"found URL: %@", matchingString); 
      string = [string stringByReplacingOccurrencesOfString:matchingString withString:@""]; 
     } 
    } 
    NSLog(string); 
    return string; 
} 

Однако string возвращается без изменений (есть совпадение).

выход Upd .: консоли:

found URL: <NSLinkCheckingResult: 0xb2b03f0>{22, 36}{http://abc.com/efg.php?EFAei687e3EsA} 
2013-10-02 20:19:52.772 
This is a sample of a http://abc.com/efg.php?EFAei687e3EsA sentence with a URL within it and a number 097843. 

Готов работать рецепт сделано @Raphael Schweikert.

+1

просто попробовал it.works для меня. Я знаю, вы считаете, что есть совпадение, но можете ли вы опубликовать журнал соответствияString? –

+0

@abhineetprasad Спасибо за информацию. Я буду обновлять сообщение с выходом. – Shmidt

ответ

2

Проблема в том, что [match description] не возвращает соответствующую строку; он возвращает строку, которая выглядит следующим образом:

"<NSLinkCheckingResult: 0x8cd5150>{22,36}{http://abc.com/efg.php?EFAei687e3EsA}" 

Для замены совпавшей URL в строке, вы должны сделать:

string = [string stringByReplacingCharactersInRange:match.range withString:@""]; 
+1

Я считаю, что это не сработает, если имеется несколько совпадений, поскольку индексы диапазона не будут корректными для последующих замен. Сначала совпадения сортируются по индексу нисходящего начала. –

+1

Да, это правильно - я просто показывал, почему его пример не работает, и каким правильным способом заменить матч. Остальное остается упражнением для читателя. ;-) – Greg

+0

@RaphaelSchweikert Спасибо, я перепишу код – Shmidt

1

Согласно Apple’s own Douglas Davidson, матчи гарантированно будут в порядке появляются в строке. Поэтому вместо сортировки массива matches (как I suggested) его можно просто повторить в обратном порядке.

Весь образец кода будет выглядеть следующим образом:

NSString *string = @"This is a sample of a http://abc.com/efg.php sentence (http://abc.com/efg.php) with a URL within it and some more text afterwards so there is no index error."; 
NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:0|NSTextCheckingTypeLink error:nil]; 
NSArray *matches = [linkDetector matchesInString:string options:0 range:NSMakeRange(0, [string length])]; 
for (NSTextCheckingResult *match in [matches reverseObjectEnumerator]) { 
    string = [string stringByReplacingCharactersInRange:match.range withString:@""]; 
} 

Проверка на match.resultType == NSTextCheckingTypeLink может быть опущена, как вы уже указали в настройках, что вы заинтересованы только в ссылках.

+0

Очень хорошо, спасибо – Shmidt

Смежные вопросы