본문 바로가기
프로그래밍/Xcode-iOS

[iOS] Objective-C 특수문자 정규표현식

by Mr-후 2017. 4. 21.
반응형

유지 보수하던 앱에서 이모티콘 입력을 못하게 막아 달라는 부탁을 받게 되었다. 

특수문자(일반적인 숫자, 영문/한글이 아닌)는 입력이 가능 해야 하고 이모티콘 문자열에 대해서만 입력이 되지 않도록 해야 한다고 한다. 입력 문자가 이모티콘인지 아닌지 체크하는 정규표현식과  현재 입력 키보드가 이모티콘 키보드인지를 체크하는 로직을 추가하였다. 

 

일반적인 본문에는 이모티콘도 입력이 가능하며 제목이나 이름, 이메일 주소등에는 이모티콘이 입력되지 못하도록 작업을 추가하였다. 

다양한 경험을 해 볼 수 있어 좋은 경험이 된 프로젝트. 

 

NSRange와 정규표현식을 이용한 문자열 체크 로직이다. 

 

 

 

 

 

Objective-C 함수. 

 

+ (BOOL) checkValidateString:(NSString *)string {

 

if (!string) {

return YES;

}

 

 

NSString *ptn = @"^[\\s-ㅎㅏ-a-zA-Z0-9-.,<>?/'\"~*&(){}|_`:;!@#$%^*+=\\-\\[\\]\\\\]*$";

NSRange checkRange = [string rangeOfString:ptn options:NSRegularExpressionSearch];

 

if (checkRange.length == 0) { // 특수문자

return NO;

} else {

return YES;

}

 

}

 

천지인 키보드에서는 완성형 한글이 되지 않는 문제가 있어서 항목을 추가도 했고 키보드에서 지원하는 모든 특수문자를 다 넣지는 못했지만 어느정도는 막을 수 있다. 

 

 

이모티콘은 입력이 불가능하다. 

실제 복사해서 붙혀넣기로 넣을 수 있지만 UITextField의 델리게이트 메서드에서 지속적으로 입력된 문자열을 체크하고 있기 때문에 입력이 불가능하다. 

 

실제 클래스에서 사용하는 방법. 

 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

 

 

//현재 키보드가 이모티콘 키보드라면 ... 

 

if ([textField isFirstResponder]) {

if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) {

return NO;

}

 

 

if (![CommonUtil checkValidateString:string]) {

//이모티콘이 입력됨

return NO;

}   

    return YES; // NO 리턴할 경우 변경내용이 반영되지 않는다.

 

}

 

UITextfield 또는 UITextView에서 입력되는 값 또는 붙혀넣기 되는 값에 대한 유효성 검증시에 사용하면 된다. 

checkValidateString의 정규표현식에 추가적으로 필요한 문자를 넣어 확장하거나 제한을 줄여서 사용해도 가능하다. 

 

 

<!— mobile browser only />

반응형