我正在开发一个应用程序,它接受一篇文章(简单的 HTML 页面)和一个词汇表(每个都可以是一个词、一个短语,甚至是一个句子),并为它的每个词创建一个链接发现。问题在于,对于包含更多术语的较大文本,需要很长时间。目前我们正在处理这个问题,最初显示未标记的文本,在后台处理链接,最后在处理完成时重新加载 web View 。不过,这可能需要一段时间,而且我们的一些用户对此并不满意。
现在,该应用程序对条款使用了一个简单的循环,在 HTML 中进行了替换。基本上:
for (int i=0; i<terms.count; i++){
NSString *term = [terms objectAtIndex:i];
NSString *replaceString = [NSString stringWithFormat:@"<a href="myUrl:\\%d>%@</a>", i, term];
htmlString = [htmlString stringByReplacingOccurrencesOfString:term
withString:replaceString
options:NSCaseInsensitiveSearch
range:NSMakeRange(0, [htmlString length] )];
}
但是,我们处理的是多种语言,因此每个学期不仅有一个替代品,而是二十个!那是因为我们必须在每个学期的开头(西类牙语中倒置的问号)和结尾处处理标点符号。我们必须用适当的超链接替换 "term"
、"term."
和 "term?"
。
我可以使用更有效的方法来标记此 HTML 吗?
我需要保留原始术语的索引,以便稍后当用户单击链接时可以检索它。
最佳答案
您可以按如下方式处理文本:
与其遍历词汇表,不如将文本拆分为单词并在词汇表中查找每个单词。
创建一些索引、哈希表或字典以提高查找效率。
不要使用
stringByReplacingOccurrencesOfString
。每次调用它时,它都会复制整个文本,并且在自动池耗尽之前不会释放内存。 (有趣的是,您还没有遇到内存问题。)而是使用一个NSMutableString
实例,您可以在其中附加每个单词(以及它们之间的字符),就像在原始文本中一样或装饰为一个链接。
关于objective-c - 优化扫描大文本并匹配单词或短语列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222664/