unity学习笔记-text⽂本识别html富⽂本(待改进)
unity学习笔记
text⽂本识别html富⽂本(待改进)
需求
项⽬⾥需要将之前外包的h5界⾯的内容移植到引擎中
前⾯已经完成了视频的在线播放(uniwebview插件实现),也通过⽅法查询信息将数据动态的展⽰在界⾯中
过程中遇到了⼀个问题,那就是接⼝返回的数据⾥存在html格式的富⽂本数据,⽽unity本⾝能够识别的富⽂本格式很少,显⽰到引擎中会出现很多html的标签字符串,看起来⼗分的不雅观
需要做到的就是在显⽰之前通过对富⽂本的处理,显⽰unity本⾝能够识别的富⽂本然后再显⽰到界⾯⾥
逻辑
通过c#先对接收到的富⽂本字符串进⾏踹选,去除掉⽤不了的标签信息,
然后通过xlua对富⽂本进⾏识别处理,返回unity能够⽀持的富⽂本格式text align center
显⽰到untiy界⾯中
实现
由于对前端的知识不是很熟悉,所以在⽹上到了⼀个通过xlua处理html富⽂本的帖⼦
链接如下
有关如何使⽤xlua这个⽹上的教程⼤多都是基础的不能在基础的,看了之后基本没卵⽤
我总结⼀下⾃⼰⽤到的⽅法
xlua的安装
(这个⽹上还是能到的),简单的说就是在
github/Tencent/xlua/releases
下载xlua,注意,下载2.1.15
配置到unity
把下载的压缩包⾥的assets⾥的plguins和Xlua⽂件导⼊到unity⾥
使⽤
上⾯提到的通过xlua实现富⽂本识别的⼤佬的帖⼦⾥只是说明了xlua的内容,具体怎么调⽤的没有说,我在⾃⼰摸索了之后是这么做的
1新建⼀个lua⽂件(streamingassets下)
写上下⾯的代码
`local test = require(“HtmlToLua”)
local testtool = {}
function Test(richText)
local result = “”
result = test:HtmlToLua(richText)
return result
end
`
第⼀⾏是在同级⽬录下引⽤其他的lua⽂件
默认的路径是在c#⾥传⼊的路径,如果c#⾥lua⽂件路径修改了的话,引⽤的时候路径也需要跟着修改
下⾯是局部变量可以不写
然后是写⼀个全局的⽅法函数,参数写上需要传⼊的数据名称(⾃定义)
把第⼀⾏引⽤的lua作为类来调⽤⾥⾯的⽅法即可
end结束⽅法
(更多的lua使⽤可以去基础的教程)
**其实逻辑就是通过新建⼀个lua引⽤已经写好的lua,调⽤它⾥⾯的⽅法就好了 **
当然这个帖⼦⼤佬写的很好(反正我看的不是很懂),只不过功能⾥没有实现对所有html标签的识别
刚好项⽬⾥接收到的数据信息⾥就有⼤佬的帖⼦⾥没有的标签
所以没办法还是得想办法
⾸先在看了⼤佬的xlua之后发现有可以对标签筛选的内容,项⽬⾥有⼀个< strong >的标签,所以就在那⾥添加了⼀个对这个标签进⾏处理的内容
如图
不过这样还不够,项⽬⾥的数据还有对< p >进⾏样式修改的内容(< p style=“text-align:center…”>)
⽽⼤佬的⽅法⾥好像只做了对span标签⾥颜⾊和⼤⼩样式的处理,没有做其他的更多操作
改进优化(待改进)
由于对前端和lua都不太熟悉,所以想到的办法就是先在C#⾥对数据进⾏处理,去掉这些处理不了的样式,像居中的效果在unity的text也能做到所以⼲脆就这么办了
通过对数据的分析发现样式的字符串附近会有"和空格,
通过string.split函数拆开字符串,然后处理判断⼀下,⽣成新的字符串,把这个字符串传给xlua解析
具体的⽅法如下
string[] parames = exText.Split('"');//exTExt就是原始的html富⽂本字符串
string first ="";
int index =0;
foreach(string parame in parames)
{
if(index%2==0)
{
if(parame.Contains(" "))
{
string[] parames2 = parame.Split(' ');
first += parames2[0];
}else first += parame;
}
index++;
}
这个⽅法就相对⽐较死,在⽬前的阶段能⽤,如果后⾯接⼝⾥返回更多的样式和标签的话,还得对他进⾏更多的判断处理看后⾯有没有时间研究⼀下吧
c#完整代码如下:
using;
using;
using;
using;
using;
using;
using;
public class RichTextDemo : MonoBehaviour
{
public Text text;
public delegate string Test(string richText);
// Start is called before the first frame update
void Start()
{
LuaEnv luaEnv =new LuaEnv();
luaEnv.AddLoader(myLoader);
string text1 ="<p><br/></p><p style=\"text-align: center;\"><strong>课程介绍</strong></p><p><strong><br/></strong></p><p style=\"text-align: center; \">⼀起来创作吧~</p>";
luaEnv.DoString("require 'main'");
Test func1 = luaEnv.Global.Get<Test>("Test");
string exText = text1;
//⼿动去掉style样式的⽅法
string[] parames = exText.Split('"');
string first ="";
int index =0;
foreach(string parame in parames)
{
if(index%2==0)
{
if(parame.Contains(" "))
{
string[] parames2 = parame.Split(' ');
first += parames2[0];
}else first += parame;
}
index++;
}
Debug.Log(first);
< =func1(first);
}
public byte[]myLoader(ref string filePath)//这个是很多教程⾥都涉及到的访问路径,有不理解的可以看看其他的lua基础帖⼦
{
string path = Application.streamingAssetsPath+"/"+ filePath +".lua";
return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(path));
}
}
这次对lua的⼆次接触发现之前学xlua热更新的还是太⽪⽑了,最近在看b站⼤佬刚出的xlua热更新的视频,⾥⾯说了ab包和代码热更的具体操作,加油吧,链接送上
同天下午更新⼀下
发现⼀个⼩bug
如果字符串⾥在⾮p标签⾥出现了空格(⽐如
123 123123
)的话是会报错的
因为按照上⾯的逻辑是有问题的,所以下午改进了⼀下对字符串的处理
using;
using;
using;
using;
using;
public class AnalysisHtml5Tools : MonoBehaviour
{
public delegate string AnalysisRichText(string richText);
// Start is called before the first frame update
void Start()
{
}
/// <summary>
/// 解析html富⽂本的⽅法
/// </summary>
/// <param name="richText">html富⽂本字符串</param>
/// <returns>解析后字符串</returns>
public string AnalysisRichTextMethod(string richText)
{
LuaEnv luaEnv =new LuaEnv();
luaEnv.AddLoader(myLoader);
//string text1 = "<p><br/></p><p style=\"text-align: center;\"><strong>课程介绍</strong></p><p><strong><br/></strong></p><p style=\"text-align: cente r;\">⼀起来创作吧~</p>";
luaEnv.DoString("require 'main'");
AnalysisRichText func1 = luaEnv.Global.Get<AnalysisRichText>("Test");
//去掉开头的换⾏
//richText = richText.Substring(11);
//string exText = richText;
//⼿动去掉style样式的⽅法
string[] parames = richText.Split('"');
int index =0;
string tem ="";
foreach(string parame in parames)
{
if(index %2==0&&!parame.Contains("text"))
{
tem += parame;
}
}
//去掉style=
string[] tem1 = tem.Split(' ');
string tem2 ="";
foreach(string parame in tem1)
{
if(parame.Contains("style"))
{
tem2 += parame.Substring(parame.IndexOf("style")+6, parame.Length -6);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论