如何在UITextField中识别令人反感的单词?

时间:2015-06-01 14:40:21

标签: ios objective-c ios7 uitextfield nsrange

我正在开发一个iOS聊天应用程序,在这里我有一个场景,我必须识别用户输入的文本包含我的提交按钮操作上的任何滥用词。我有一个很大的滥用词列表,以便识别。

我使用下面的代码来识别滥用的单词,但我在这里面临一个问题 例如。我的滥用词汇列表包含“地狱”。如果我在文本字段中输入“Hello”,则显示为滥用单词,因为Hello包含地狱。

这是我的代码

   NSArray *arrayOfStrings = [[rateQuery findObjects] mutableCopy];
arrayOfStrings=[arrayOfStrings valueForKey:@"Words"];//List of Abusing words

NSString *stringToSearchWithin = nameFld.text;//user entered text
__block NSString *result = nil;
[arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent
                             passingTest:^(NSString *obj, NSUInteger idx, BOOL *stop)
 {
     if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound)
     {
         result = obj;
         *stop = YES;
         //return YES;
     }
     return NO;
 }];
if (!result){
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings");

}
else
{
    NSLog(@"The string contains Abusing words");
}

3 个答案:

答案 0 :(得分:1)

将每条消息分成一个单词数组,然后循环遍历每个单词。

但理想情况下,您应该研究正则表达式(正则表达式)。 Cocoa通过使用NSRegularExpression支持正则表达式。

答案 1 :(得分:0)

你可以修改这个

if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound)

以下内容:

if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound && stringToSearchWithing.length == obj.length)

另一种方法可能是用空格或其他分隔符分割文本,然后检查单词数组是否包含这些单词。

答案 2 :(得分:0)

最终我用下面的代码解决了我的问题。

+(BOOL)profaneWordsFilterInText:(NSString *)inText
  {

     NSArray * listOfProfaneWords = [[self wordSet] allObjects];
     NSError *error = NULL;

     NSString *profaneWord ;

     for (profaneWord in listOfProfaneWords) 
     {
       NSString *as=[NSString stringWithFormat:@"\\b%@\\b", profaneWord ];

    NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:as options:NSRegularExpressionCaseInsensitive  error:&error];

    NSUInteger numberOfMatches = [regex numberOfMatchesInString:inText   options:0 range:NSMakeRange(0, [inText length])];

    if (numberOfMatches > 0)
    {
        return YES;
    }
}
return NO;
}