需求分析
- 这个程序使用户能够在网页中输入模板,在数据库中查找模板匹配到的文本,并在文本中高亮显示匹配内容
使用的工具
程序主要是基于python的,用到了web.py、html设计、正则表达式、postgresql数据库管理系统、hash编码(MD5)、http协议中的资源传递方法GET和POST:
- python是后台处理的工具:
- python中的web库包含了网页编程中很多功能强大的模块,可以使用 web.template.render('templates/')方法建立模板,并建立html文件放在templates文件夹中,使python 能够解释html文件,实现网页显示功能,GET和POST方法能够从网页中获取需要的资源;
- python中的正则表达式库re帮助python有效的处理文本和模板的查找匹配,能够对文本进行替换和修改,以满足不同的文本处理需求;
- html语言完成网页页面的设计和数据传递
- postgresql是关系型数据库管理系统,psycopg2 库支持python进行数据库操作,而且postgresql支持在数据库中的正则匹配
- hash库hashlib完成文本编码工作,将文本编码成固定大小的hash码,在数据库中存储文本时,同时存储对应的hash码,由于hash码很短,字符串匹配时间段,能够帮助数据库很快的进行查找
- 学习使用http协议能够帮我很好的理解网页前端和后台处理中数据传递的过程,函数GET和POST在数据传递中起到重要作用
实现功能
- 在网页url中用户能够以添加参数的方式查询数据库中特定id对应的文本,显示在网页中
- 用户可以在输入框中输入文本或正则表达式,点击提交按钮,可以在特定id的文本中进行正则匹配,输入可以是多段的,段与段之间使用多个'#'分开,提交后,模板在文本中高亮显示。如果模板有多段,则分别高亮显示,显示结果放在新的跳转网页中
- 用户也可以在输入框中输入查询文本,查询整个表中所有包含输入文本的id,并以超链接形式显示,超链接可以链接到对应id的查询页面,即第一步中的功能
结构组成
包括网页显示结构和数据库中的表结构:
- 网页页面组成:
- 页面分为左右两栏,左边一栏用于显示文本
- 右边一栏包括文本输入框和两个按钮
- 按钮分别是提交按钮和查询按钮
- 数据库中的表的结构:
- 表1中包括两个字段,文本字段和id字段,其中id字段是自增的
Table "public.template_for_16_rule"Column Type Modifiers 含义 showtext text 存储原始文本 id integer not null default nextval('test_id_seq'::regclass) 文本标号,主键 Indexes:
"test_pkey" PRIMARY KEY, btree (id) - 表2中的字段包括输入文本段、输入文本段对应正则表达式(上步中转换后的结果)、hash编码和id(自增),又添加了创建时间字段、更新时间字段和状态字段
Table "public.template_for_16_rule"Column Type Modifiers 含义 intext text 用户输入文本 pattern text 正则模板 hashmd5 text hash编码,有唯一属性 id integer not null default nextval('userinput_id_seq'::regclass) 标号 create_time timestamp without time zone default now() 创建时间 update_time timestamp without time zone default now() 更新时间 status integer 状态 Indexes:
"uniqid" UNIQUE CONSTRAINT, btree (hashmd5)
- 表1中包括两个字段,文本字段和id字段,其中id字段是自增的
查询流程
- 在左边页中显示文本:
- 用户在地址栏输入url链接
- 可以在链接后面跟上参数id,例如url+“?id=2”
- 后台用GET方法获取id值并在数据库的表1中查找id对应的文本,并将查找到的文本以参数形式输入到html中,解析html文件,将查找结果显示在网页左栏
- 如果用户不添加参数,则显示默认文本,即显示出指定id对应的文本
- 用户在输入框中输入查找内容,可以是正则表达式,输入内容可以是多段的,段与段之间用若干'#'分开,例如:
- 正则匹配:
- 将用户在url中输入的参数id通过隐藏标签hidden由GET方法传递到POST方法:
- html页面的form表单中包含文本框和按钮的标签,匹配提交按钮添加javascript函数,处理单击按钮事件;
- 在form中添加hidden标签,在按钮处理函数中GET方法中获得的id通过html参数传递进来并赋给hidden的值字段;
- POST方法可以获取form中hidden的值,实现了id的传递;
- 使用python中psycopg2 的处理数据库功能,查找数据库表1,找出id对应文本内容
- 将传递到后台的用户输入进行处理:
- 使用正则表达式方法去掉文本中的回车符(不是换行)
- 使用正则表达式方法将空格换成表示多个空格的正则表达式
- 使用正则表达式方法将输入文本中的数字(包括小数点)换成能够表示所有数字的正则表达式
- 将用户在url中输入的参数id通过隐藏标签hidden由GET方法传递到POST方法:
- 将文本以若干'#'号分开,对每一段进行处理:
- 对一段文本进行hash编码(MD5),并使用该字段查找数据库的表2
- 如果表中不存在本段hash编码则将此段文本、对应正则表达式和编码存到表中
- 将每段正则表达式替换为html语言的对应文本,并添加颜色信息
- 用户点击提交按钮,会在新的页面中显示出已经分段高亮的文本
- 对查阅功能按钮的实现:
- 将用户输入传到后台,同样进行正则转换处理
- 用代替所有字符正则表达式代替用户输入文本中的若干连续'#'
- 在数据库的表1中,对文本字段进行正则匹配,获取匹配成功文本对应的id序列
- 在新的页面中显示匹配成功的id,并将其做成超链接,链接地址是对应id的起始查找url
遇到的问题和解决方法
- 学习正则表达时,常常会因为不知道正则表达式中的一些规则盲目的进行表达式组合,在匹配尖括号时要表示除了>外所有的字符,我曾尝试将所有的字符列出来,结果不可能一个一个列出所有类型的字符,而正则表达式只需要使用[^>]即可……详细
- 在文本替换时找不到好的方法,正则表达式中的sub方法能够很好的解决这个问题,作用很大
- 在实现高亮显示时,出现bug,如果使用连续的字符,成功,带空格和换行,检测不出来。经过晓旭指导,明白先进行文本转换(转变成html格式)后进行匹配时,匹配的文本已经发生变化了,需要先进行正则匹配,再进行文本转换详细
- vim使用不熟练,在编写代码时效率不高。晓旭经常手把手的指导,我才慢慢地对vim中一些快捷的操作有些了解详细
- 对分段进行处理时,使用.+替换多个#号,替换了#分割符后程序一直匹配不到相应的字符串,这是因为使用.+替换#分割符后不能够查找匹配原文 中的换行符,经过晓旭不断的测试并查找资料,找到了解决换行匹配的方法:在正则匹配时添加参数re.S:使.符号包含所有的字符,包括换行符,还需要将输 入文本中的回车符去掉,它会直接影响匹配结果,这两个问题花了我们一下午时间详细
- 需要使用两个按钮实现不同功能时,在html文件的form中添加了按钮标签,但是在功能实现时出现问题,两个按钮都是提交按钮,做相同的事 情。解决方法:将两个按钮类型都改为button,分别为两个按钮添加点击事件,并编写javascript函数处理单击事件,分别处理不同的请求并提 交,实现了对输入文本进行不同的操作详细
- 链接数据库后,显示文本根据数据库中的数据显示,但是匹配并高亮处理的文本没有链接的数据库,显示不正确的文本。需要将用户在url中输入的 id字段通过GET方法传递给POST方法,实现匹配数据库。这要用到html中的hidden标签,将hidden(在form中)中的值传递给 POST方法
- 使用hidden又遇到问题,GET方法获取的id字段怎么传递给hidden?经过晓旭提示才恍然大悟,使用html参数,在GET函数返回 时,将id字段作为参数引如到html中,以javascript函数方式将该值赋给hidden的value,POST就可以获取该字段详细