2013-10-02 48 views
0

試圖從文本刪除URL重寫:的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我。我知道你相信有一場比賽,但你可以發佈matchingString的日誌嗎? –

+0

@abhineetprasad感謝您的信息。我會用輸出更新帖子。 – Shmidt

回答

2

的問題是,[match description]不會返回匹配的字符串;它返回一個字符串,它看起來像這樣:

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

要更換你的字符串匹配的網址,你應該做的:

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