第42月第18天 iOS匹配特殊字符 markedTextRange

1.

- (BOOL)checkSpecialCharacter:(NSString *)string
{
    NSString *regex = @"[`~!@#$^&*()=|{}':;',\[\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [pred evaluateWithObject:string];
}

  https://www.jianshu.com/p/88be28860cde

    __block BOOL isMatch = NO;
    NSString *letters = @"(  ˃᷄˶˶̫˶˂᷅  )౿(།﹏།)૭ᕙ(•̤᷆ ॒ ູ॒•̤᷇)ᕘ_(___°π°œ)_「」°|_|_=3( ´・ᴗ・` )*/ω\*)£";
    [letters enumerateSubstringsInRange:NSMakeRange(0, [letters length])
                                options:(NSStringEnumerationByComposedCharacterSequences)
                             usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        if ([string containsString:substring]) {
            NSLog(@"match character:%@",substring);
            isMatch = YES;
            *stop = YES;
        }
    }];
    
    if (!isMatch) {
        NSString *pattern = @"[`~!@#$^&*()=|{}':;',\[\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]+";
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
        isMatch = [pred evaluateWithObject:string];
    }
    NSLog(@"%@ is SpecialCharacters:%d",string,isMatch);
- (NSInteger)curOffset{
 
    // 基于文首计算出到光标的偏移数值。
    return [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];
 
}
 
- (void)makeOffset:(NSInteger)offset{
 
    // 实现原理是先获取一个基于文尾的偏移,然后加上要施加的偏移,再重新根据文尾计算位置,最后利用选取来实现光标定位。
    UITextRange *selectedRange = [self selectedTextRange];
    NSInteger currentOffset = [self offsetFromPosition:self.endOfDocument toPosition:selectedRange.end];
    currentOffset += offset;
    UITextPosition *newPos = [self positionFromPosition:self.endOfDocument offset:currentOffset];
    self.selectedTextRange = [self textRangeFromPosition:newPos toPosition:newPos];
 
}
 
- (void)makeOffsetFromBeginning:(NSInteger)offset{
 
    // 先把光标移动到文首,然后再调用上面实现的偏移函数。
    UITextPosition *begin = self.beginningOfDocument;
    UITextPosition *start = [self positionFromPosition:begin offset:0];
    UITextRange *range = [self textRangeFromPosition:start toPosition:start];
    [self setSelectedTextRange:range];
    [self makeOffset:offset];
 
}

https://blog.csdn.net/zhanglizhi111/article/details/71411584

2.

- (void)textViewDidChange:(UITextView *)textView {
    if (self.titleTextView.markedTextRange == nil && [TCUtil getContentLength:self.titleTextView.text] > kTCMaxPushTitleLen) {      
        [[HUDHelper sharedInstance] tipMessage:@"已达到最大限制字数"];
        self.titleTextView.text = [self.titleTextView.text substringToIndex:(self.titleTextView.text.length-1)];
        
        [textView resignFirstResponder];
    }
    
}
//通过分别计算中文和其他字符来计算长度
+ (NSUInteger)getContentLength:(NSString*)content {
    size_t length = 0;
    for (int i = 0; i < [content length]; i++)
    {
        unichar ch = [content characterAtIndex:i];
        if (0x4e00 < ch  && ch < 0x9fff)
        {
            length += 2;
        }
        else
        {
            length++;
        }
    }
    
    return length;
}

https://www.github.com/tencentyun/MLVBSDK/

- (void)notifyTextChange:(NSNotification *)n
{
    if ( self.maxInputLength == 0 )
    {
        return;
    }
    
    if ( n.object != self.inputView )
    {
        return;
    }
    
    UITextField *textField = self.inputView;
    
    NSString *toBeString = textField.text;

    UITextRange *selectedRange = [textField markedTextRange];
    //获取高亮部分
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
    if (!position) {
        if (toBeString.length > self.maxInputLength) {
            textField.text = [toBeString mm_truncateByCharLength:self.maxInputLength];
        }
    }
}
- (NSString *)mm_truncateByCharLength:(NSUInteger)charLength
{
    __block NSUInteger length = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, [self length])
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                              
                              if ( length+substringRange.length > charLength )
                              {
                                  *stop = YES;
                                  return;
                              }
                              
                              length+=substringRange.length;
                          }];
    
    return [self substringToIndex:length];
}

https://github.com/CoderLT/MMPopupView

3.

uploadUrl = [uploadUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

原文地址:https://www.cnblogs.com/javastart/p/12519702.html