iOS开发进阶 - 富文本正则替换表情
移动端访问不佳,请访问我的个人博客
最近写项目需要用到富文本解析字符串显示表情,下面是我使用正则替换实现富文本的方式,希望能帮助到大家
先上效果图和demo地址
实现过程中需要用到的知识点
- NSRegularExpression(正则表达式)
- NSMutableAttributedString(用来显示富文本的string)
废话不多说,直接贴代码:
import UIKit
struct WCLEmojiParse {
//所有表情对应的字符串
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]"]
//String的格式
static let textAttributes = [NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName: UIColor.black]
//正则表达式的格式
static let pattern = "\\[+[a-z]+\\]"
//表情的bounds
static let attachmentBounds = CGRect.init(origin: CGPoint.init(x: 0, y: -5), size: CGSize.init(width: 24, height: 24))
//MARK: Public Methods
static func replaceEmoji(_ str: String) -> NSAttributedString {
//转成NSString
let originalNSString = str as NSString
//通过str获得NSMutableAttributedString
let attStr = NSMutableAttributedString.init(string: str, attributes: textAttributes)
var regex: NSRegularExpression?
do {
regex = try NSRegularExpression.init(pattern: pattern, options: .caseInsensitive)
} catch let error as NSError {
print(error.localizedDescription)
}
//获取到匹配正则的数据
if let matches = regex?.matches(in: str, options: .withoutAnchoringBounds, range: NSMakeRange(0,attStr.string.characters.count)) {
if matches.count > 0 {
//遍历符合的数据进行解析
for i in 0..<matches.count {
let result = matches[matches.count-i-1]
let range = result.range
let emojiStr = originalNSString.substring(with: range)
//符合的数据是否为表情
if emotions.contains(emojiStr) {
if let image = UIImage.init(named: emojiStr) {
//创建一个NSTextAttachment
let attachment = NSTextAttachment()
attachment.image = image
attachment.bounds = attachmentBounds
//通过NSTextAttachment生成一个NSAttributedString
let rep = NSAttributedString(attachment: attachment)
//把表情于之前的字符串替换
attStr.replaceCharacters(in: range, with: rep)
}
}
}
}
}
return attStr
}
}
以上是简单的富文本显示表情的方式,抛砖引玉,大家见笑了,希望大家能学到东西,谢谢大家的阅读
iOS开发进阶 - 富文本正则替换表情的更多相关文章
- iOS开发进阶
<iOS开发进阶>基本信息作者: 唐巧 出版社:电子工业出版社ISBN:9787121247453上架时间:2014-12-26出版日期:2015 年1月开本:16开页码:268版次:1- ...
- iOS开发进阶(唐巧)读书笔记(一)
如何提高iOS开发技能 1.阅读博客:https://github.com/tangqiaoboy/iOSBlogCN 40多位iOS开发博主的博客地址 2.读书:每年阅读一本高质量的iOS开发书籍 ...
- 【原】iOS开发进阶(唐巧)读书笔记(二)
第三部分:iOS开发底层原理 1.Objective-C对象模型 1.1 isa指针 NSObject.h部分代码: NS_ROOT_CLASS @interface NSObject <NSO ...
- iOS开发进阶--1.多线程简介
学习是由已知的知识模型推理未知的知识模型的的过程. 本文适合学习完objective-c基础,想进一步提高做iOS开发的同学阅读. 在说线程的时候,我们先看看进程. 1.进程 每一个运行在系统中的应用 ...
- iOS开发进阶之 UIWebView
刚接触IOS开发1年多,现在对于混合式移动端开发越来越流行,因为开发成本上.速度上都比传统的APP开发要好,混合式开发是传统模式与PC网页端相结合的模式.那么提到了 APP的混合模式开发,在Andro ...
- 支付宝小程序开发——rich-text富文本组件支持html代码
前言: 与微信小程序不同,支付宝小程序的富文本组件并不能直接支持html代码,如: 如上,支付宝小程序的富文本组件只支持数组类型,html代码需要使用 mini-html-parser 转换,具体用法 ...
- 《iOS开发进阶》书籍目录
第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经 ...
- 【Android开发】富文本
SpannableString spannableString = new SpannableString("设置文字的前景色为淡蓝色"); ForegroundColorSpan ...
- IOS开发UI基础文本属性Attributes
文本属性Attributes 1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont systemFo ...
随机推荐
- 解决Atom的 gpp compiler,编译后在Windows的命令行终端运行,中文乱码
按下快捷键Win+R,输入regedit打开注册变编辑器,依次找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\,右键新建一个字符串 ...
- fastjson的deserializer的主要优化算法
JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...
- 使用Standford coreNLP进行中文命名实体识别
因为工作需要,调研了一下Stanford coreNLP的命名实体识别功能. Stanford CoreNLP是一个比较厉害的自然语言处理工具,很多模型都是基于深度学习方法训练得到的. 先附上其官网链 ...
- 12.Project Fields to Return from Query-官方文档摘录
1 插入例句 db.inventory.insertMany( [ { item: "journal", status: "A", size: { h: 14, ...
- freemarker学习#1
在工作的过程中遇到了.ftl文件.打开发现里面是一些类似于html的代码,非常好奇这是一种什么样的文件,于是去网上搜了一下,了解到.ftl是Freemarker模板的文件后缀名.将问题转移到了Free ...
- maven 之 web.xml 头设置错误问题
1.一般开发工具创建web.xml的时候会默认添加web.xml头,而有些插件(例如maven相关插件)默认添加的为 版本和你的开发工具Project facets(项目特性)中设置不同.那么就会导致 ...
- SQL Server 2008 添加登录账户并配置权限
首先打开数据库,并以windows身份验证模式进入数据库. 然后在左侧的[对象资源管理器中]展开[安全性]节点,鼠标右键点击节点中的[登录名],在弹出的菜单中单击[新建登录名],弹出一个对话框. 1. ...
- C++学习笔记--名称空间
名称空间是为了更好的控制名称的作用域,以管理不同的类库,避免发生冲突. 1.创建名称空间 如下,使用namespace关键字创建了pers和debts两个名称空间. #ifndef NAMESP_H_ ...
- Guid ToString 格式知多少?
在日常编程中,Guid是比较常用的,最常见的使用就是如下所示: string id = Guid.NewGuid().ToString(); 这条语句会生成一个新的Guid并转成字符串,如下: // ...
- Maven打包部署
Maven打Jar包 问题一 Eclipse突然SB告诉我类不存在还让我导包进来O__O "…,但是我明明有这个类.这是不要慌,通过在网上搜索得知:由于eclipse的编译是基于时间戳的判断 ...