技术控

    今日:291| 主题:58027
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] iOS开发进阶 - 富文本正则替换表情

[复制链接]
不合您胃口 投递于 2016-11-29 09:17:25
104 0
最近写项目需要用到富文本解析字符串显示表情,下面是我使用正则替换实现富文本的方式,希望能帮助到大家
   先上效果图和 demo地址
   

iOS开发进阶 - 富文本正则替换表情

iOS开发进阶 - 富文本正则替换表情-1-技术控-效果图,import,origin,表达式,知识点

  实现过程中需要用到的知识点
  
       
  • NSRegularExpression(正则表达式)   
  • NSMutableAttributedString(用来显示富文本的string)  
  废话不多说,直接贴代码:
        
  1. import UIKit
  2. struct WCLEmojiParse {
  3.    
  4.     //所有表情对应的字符串
  5.     static let emotions = ["[angry]", "[beers]", "[blush]", "[bomb]", "[cool]", "[flushed]", "[grin]", "[gun]", "[heart]", "[heartseyes]", "[imp]", "[Joy]", "[kiss]", "[ok]", "[persevere]", "[pray]", "[punch]", "[scream]", "[shit]", "[skull]", "[sleeping]", "[smiley]", "[smirk]", "[sob]","[sweat]", "[thumbsup]", "[tongue]", "[unamused]", "[v]", "[weary]", "[wink]", "[yum]"]
  6.    
  7.     //String的格式
  8.     static let textAttributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName: UIColor.black]
  9.     //正则表达式的格式
  10.     static let pattern = "\\[+[a-z]+\\]"
  11.     //表情的bounds
  12.     static let attachmentBounds = CGRect.init(origin: CGPoint.init(x: 0, y: -5), size: CGSize.init(width: 24, height: 24))
  13.    
  14.     //MARK: Public Methods
  15.     static func replaceEmoji(_ str: String) -> NSAttributedString {
  16.         //转成NSString
  17.         let originalNSString = str as NSString
  18.         //通过str获得NSMutableAttributedString
  19.         let attStr = NSMutableAttributedString.init(string: str, attributes: textAttributes)
  20.         var regex: NSRegularExpression?
  21.         do {
  22.             regex = try NSRegularExpression.init(pattern: pattern, options: .caseInsensitive)
  23.         } catch let error as NSError {
  24.             print(error.localizedDescription)
  25.         }
  26.         //获取到匹配正则的数据
  27.         if let matches = regex?.matches(in: str, options: .withoutAnchoringBounds, range: NSMakeRange(0,attStr.string.characters.count)) {
  28.             if matches.count > 0 {
  29.                 //遍历符合的数据进行解析
  30.                 for i in 0..<matches.count {
  31.                     let result = matches[matches.count-i-1]
  32.                     let range = result.range
  33.                     let emojiStr = originalNSString.substring(with: range)
  34.                     //符合的数据是否为表情
  35.                     if emotions.contains(emojiStr) {
  36.                         if let image = UIImage.init(named: emojiStr) {
  37.                             //创建一个NSTextAttachment
  38.                             let attachment    = NSTextAttachment()
  39.                             attachment.image  = image
  40.                             attachment.bounds = attachmentBounds
  41.                             //通过NSTextAttachment生成一个NSAttributedString
  42.                             let rep = NSAttributedString(attachment: attachment)
  43.                             //把表情于之前的字符串替换
  44.                             attStr.replaceCharacters(in: range, with: rep)
  45.                         }
  46.                     }
  47.                 }
  48.             }
  49.         }
  50.         return attStr
  51.     }
  52. }
复制代码
       demo地址
  以上是简单的富文本显示表情的方式,抛砖引玉,大家见笑了,希望大家能学到东西,谢谢大家的阅读
   [email protected]_C__L
  2016 年 11月 28日



上一篇:Spring框架下的 “接口调用、MVC请求” 调用参数、返回值、耗时信息输出 ...
下一篇:.NET控件的架构设计
我要投稿

回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 | 粤公网安备 44010402000842号 )

© 2001-2017 Comsenz Inc.

返回顶部 返回列表