lua标签解析器

lua 标签解析器


概述



一个类xml标签解析函数,将标签解析成Lua中的表结构
它可以用来解析简单xml结构,可以作为RichLabel控件的字符串解析组件(其实它现在就是这么用的;-))

原理



使用lua的模式匹配, 使用了模式串%b<>
%b用来匹配对称的字符。常写为 %bxy,x和y是任意两个不同的字符。 x作为匹配的开始,y作为匹配的结束。
比如,%b<> 匹配以 < 开始,以 > 结束的字符串

要解析的字符串

hello world
<div>hello world</div>
你好
<div fontName=‘nihao‘ fontColor=#ffccdd>hello,world</div>
<div></div>

代码基本结构

-- 迭代所有格式为<xxx>的标签(包含了标签头和标签尾)
local beginindex, endindex = string.find(text, "%b<>", 1)
while beginindex do
    -- 获得下一个标签的位置
    beginindex, endindex = string.find(text, "%b<>", endindex)
end

上面获得的beginindex和endindex分别是标签的在字符串中开始和结束的index值 但并不区分标签头和标签尾,
还得判断标签到底是标签头还是标签尾。

-- 获得当前标签,字符串截取出来
local label = string.sub(text, beginindex, endindex)
-- 判断当前标签是不是以‘</‘开头,若是以‘</‘开头则代表为标签尾巴,否则为标签头
if string.find(label, "^</") then
else
end

至此已经可以在正确的从字符串中提取所有的标签,并且区分出标签头和标签尾了

处理标签匹配问题
为了支持标签嵌套包含,我们得用一个栈记录标签头,要不然嵌套好几层标签不好判断内容被哪个标签修饰。
具体做法:
+ 若当前标签是标签头则将栈顶标签,到新标签头之间内容用栈顶标签修饰,并且将当前标签入栈
+ 若当前标签是标签尾则将栈顶标签,到新标签尾之间内容用栈顶标签修饰,并将栈顶标签出栈
简单来说:
栈顶标签修饰当前的内容(新标签和栈顶标签之间的内容) ,然后根据新标签是头还是尾决定入栈或出栈

我们没有考虑特殊情况,若字符串最完成不是标签那最外层处理会存在点问题。
好吧,那我们可以直接在字符串外层加上一组标签就好了,很简单吧。

现在我们解析出了内容和修饰内容的标签,离成功不远了!!

解析标签头
这应该是最简单的一部,但又是最繁琐的一步。
因为标签头内容很少了,格式也确定了,只要提取出标签名和属性的key-value对就可以了
不过提取属性key-value对比较繁琐,要考虑value的种种可能,当然我考虑的并不全面也没打算那么全面,只要功能够用就可以了

第一步
解析出标签名,简单的模式匹配

local labelnameindex1, labelnameindex2 = string.find(label, "%w+")

因为我们要解析的串大多是手写,为了减小书写难度,标签名属性名最好不区分大小写

-- 获得标签名称
local labelname = string.sub(label, labelnameindex1, labelnameindex2)
labelname = string.lower(labelname)

第二步
获取属性,还是模式匹配,匹配形式为 propertyname=propertyvalue(等号两边不能存在空格)
propertyname 要求就是字母或者数字的组合
propertyvalue 要求就比较多, 因为颜色使用的是web的标记形式#FF33AA, 而且字符串也可能是括起来表示。
%w: 与任何字母/数字配对
%s: 与空白字符配对

-- value要求非空白字符并且不含有‘>‘字符的一个单词
string.gmatch(labelhead, "%w+%=[^%s%>]+")

gmatch会返回一个迭代器,每次运行都返回一个匹配串,所以我们这么写

for property in string.gmatch(labelhead, "%w+%=[^%s%>]+") do
end

在循环中我们可以处理每个属性对字符串无非就是根据=位置分离出属性名和属性值,属性名不需要处理,
把属性值做一下处理然后放到一个table中就好了,处理如下:

local equalmarkpos = string.find(property, "=")
-- 分离属性名和属性值
local propertyname = string.sub(property, 1, equalmarkpos-1)
local propertyvalue = string.sub(property, equalmarkpos+1, string.len(property))
-- 属性名转为小写
propertyname = string.lower(propertyname)
-- 属性值处理
local continue = false
-- 1.检测是否为字符串(单引号或者双引号括起来)
local beginindex, endindex = string.find(propertyvalue, "[‘\"].+[‘\"]")
if beginindex then
    propertyvalue = string.sub(propertyvalue, beginindex+1, endindex-1)
    continue = true
end
-- 2.检测是否为布尔值
if not continue then
    local propertyvalue_lower = string.lower(propertyvalue)
    if propertyvalue_lower == BOOLEAN_TRUE then
        propertyvalue = true
        continue = true
    elseif propertyvalue_lower == BOOLEAN_FALSE then
        propertyvalue = false
        continue = true
    end
end
-- 3.检测是否为数字
if not continue then
    local propertyvalue_number = tonumber(propertyvalue)
    if propertyvalue_number then
        propertyvalue = propertyvalue_number
        continue = true
    end
end
-- 若以上都不是,则默认直接为字符串
labelparams[propertyname] = propertyvalue

顺便吐槽一下lua没有关键字continue,造成程序嵌套层次变深

最后完整代码在我的github上面叫labelparser,lua5.1解析器可以直接运行,无需任何依赖

时间: 2024-08-05 14:57:20

lua标签解析器的相关文章

SpringMVC 视图和视图解析器&amp;表单标签

视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel.JFreeChart 等各种表现形式的视图 视图 视图的作用是渲染模型数据,将模

[Python]HTML/XML解析器Beautiful Soup

[简介] Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.即HTML/XMLX的解析器. 它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作.它可以大大节省你的编程时间. [安装] 下载地址:点击打开链接 Linux平台安装: 如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装: $ apt-get install Python-bs4 B

PHP XML Expat 解析器

PHP XML Expat 解析器 内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能. XML 是什么? XML 用于描述数据,其焦点是数据是什么.XML 文件描述了数据的结构. 在 XML 中,没有预定义的标签.您必须定义自己的标签. 如需学习更多关于 XML 的知识,请访问我们的 XML 教程. Expat 是什么? 如需读取和更新 - 创建和处理 - 一个 XML 文档,您需要 XML 解析器. 有两种基本的 XML 解析器类型: 基于树的解析器:这种解析器把 XML

Spring视图和视图解析器

1.配置直接转发的页面 <!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-controller path="/success" view-name="success"/> <!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 --> <mvc:annotation-driven><

爬虫学习——网页解析器Beautiful Soup

一.Beautiful Soup的安装与测试 官方网站:https://www.crummy.com/software/BeautifulSoup/ Beautiful Soup安装与使用文档:  https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 1.首先测试一下bs4模块是否已经存在,若不存在再安装即可,我用的是kali测试发现bs4模块已经存在,下面介绍如何测试与安装 新建python文档输入以下代码 1 import bs4 2

笔记:XML-解析文档-流机制解析器(SAX、StAX)

DOM 解析器完整的读入XML文档,然后将其转换成一个树型的数据结构,对于大多数应用,DOM 都运行很好,但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那么我们应该使用流机制解析器(streaming parser),Java 类库提供的流解析机制有 SAX 解析器和 StAX 解析器,SAX 解析器是基于事件回调机制,而 StAX解析器提供了解析事件的迭代器. 使用SAX解析器 SAX 解析器在解析XML 输入的组成部分时会报告事件,在使用 SAX

极其简便的PHP HTML DOM解析器PHP Simple HTML DOM Parser/有中文手册

极其简便的PHP HTML DOM解析器PHP Simple HTML DOM Parser,有中文手册,对于需要分析HTML代码dom结构的php开发者来说,是一个极其有用的函数库,使用Jquery风格的dom节点查找语法,强烈推荐. 下面是其"快速入门",从中文手册里节选而来 //从一个URL或者文件创建一个DOM对象$html = file_get_html('http://www.google.cn/'); // 寻找所有的img标签foreach($html->find

Java开源的支持xpath的html解析器介绍--JsoupXpath

JsoupXpath (https://github.com/zhegexiaohuozi/JsoupXpath)是一款纯Java开发的使用xpath解析提取html内容的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath. 为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发了JsoupXpath.JsoupXpath的实现逻辑清晰,扩展方便, 支持几乎全部常用的xpath语法,如下面这些:

spring4.2完整web项目(使用html视图解析器)

完整配置springmvc4,最终视图选择的是html,非静态文件. 最近自己配置spring的时候,遇到很多问题,由于开发环境和版本的变化导致网友们给出的建议很多还是不能用的,可能还会有很多人会遇到和我一样的问题,希望能帮到遇到困难的人. 环境:jdk8,spring4.2.0,tomcat8,使用idea14编辑器,maven管理,git版本控制器,项目远程库地址github:https://github.com/627135316/on_line.欢迎大家clone.中间的用户名也是我qq