我想在字符串中搜索搜索字词,并突出显示字符串中的所有匹配项。
应显示搜索字词周围的某些文字(介于...之间),搜索字词应采用粗体字体样式(NSMutableAttributedString)。
示例:搜索“text”
...示例文字 bla ...... ...更多文字 blabla ...... bla 文字 blabla ..
NSString *haystackString = [[self.searchResults objectAtIndex:indexPath.row] stripHTML];
NSString *needleString = self.searchDisplayController.searchBar.text;
if (!self.searchRegex) {
self.searchRegex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"(?:\\S+\\s)?\\S*%@\\S*(?:\\s\\S+)?", needleString] options:(NSRegularExpressionDotMatchesLineSeparators + NSRegularExpressionCaseInsensitive) error:nil];
}
NSArray *matches = [self.searchRegex matchesInString:haystackString options:kNilOptions range:NSMakeRange(0, haystackString.length)];
NSMutableString *tempString = [[NSMutableString alloc] init];
for (NSTextCheckingResult *match in matches) {
[tempString appendString:@"..."];
[tempString appendString:[haystackString substringWithRange:[match rangeAtIndex:0]]];
[tempString appendString:@"..."];
}
if (tempString) {
cell.textLabel.text = tempString;
}
我当前的代码似乎很慢,但还不支持NSMutableAttributedString。有更好的解决方案吗?谢谢!
答案 0 :(得分:0)
要使用attributionString,只需像这样更改代码
// Create a reusable attributed string dots and matchStyle dictionary
NSAttributedString *dots = [[NSAttributedString alloc] initWithString:@"..."];
NSDictionary *matchStyle = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:12]};
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
for (NSTextCheckingResult *match in matches)
{
NSString *matchString = [haystackString substringWithRange:[match rangeAtIndex:0]];
[attributedText appendAttributedString:dots];
[attributedText appendAttributedString:[[NSAttributedString alloc] initWithString:matchString attributes:matchStyle]];
[attributedText appendAttributedString:dots];
}
if (attributedText.length > 0)
{
cell.textLabel.attributedText = attributedText;
}
最佳, 的Sascha
答案 1 :(得分:0)
NSScanner
可用作正则表达式的替代方法,以查找文本的位置。获得匹配的位置后,您可以提取前后部分并构建结果字符串。
使用这两种技术,您应该先处理字符串并构建结果集,然后再尝试在表中显示结果。这可确保滚动时不会进行任何实际处理。
如果之前无法执行此操作,请在后台线程上运行它并将结果推回到主线程以更新单元格(如果它仍然可见,请使用索引路径进行检查)。