前些日子写项目,测试提出要求要禁止表情的录入,在UITextField这个代理方法中shouldChangeCharactersInRange,只能够限制键盘上的表情不能录入,但是录入时联想上的表情还是能够录入,所以最终用了下边的方法,但是可能还会有问题。
究其原因,测试说防止数据库的表被注入什么的,但是我感觉这些活是后台要做的,后台直接拿传入的字符串直接作为数据库的查询条件,肯定会有问题的,但是惹不起测试 ,只能够做了限制了!如果有更好的办法,欢迎指正。
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textDidChange:)
name:UITextFieldTextDidChangeNotification
object:nil];
}
- (void)textDidChange:(NSNotification*)nf{
UITextField *tf = (UITextField*)nf.object;
NSString *string = [self filterEmoji:tf.text];
if (string) {
tf.text = string;
}
}
- (NSString*)filterEmoji:(NSString*)text{
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f ]" options:NSRegularExpressionUseUnixLineSeparators error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:text
options:0
range:NSMakeRange(0, [text length])
withTemplate:@""];
if (![modifiedString isEqualToString:text]) {
return modifiedString;
}else{
return nil;
}
}
//在此要干掉通知
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}