正则表达的应用及优化

来源:互联网 发布:导入支付宝数据账本 编辑:程序博客网 时间:2024/06/06 19:21

正则表达式的优化及应用

正则表达式的效率与优化

正则表达式也讲究效率的,因为不同的表达式引擎执行的算法就不同。perl用的引擎是传统NFA引擎。
正则表达式使用要注意第一点:
(1)使用字符组代替分支条件。
比如,使用[a-d]或[abcd]表示a-d之间的字母,而不要使用(a|b|c|d)。因为在匹配单个字符的时候,引擎会把[abcd]这样的字符组视为一个元素,而不是4个元素。整个元素作为匹配迭代的一个单元,不像(a|b|c|d)要进行迭代4次。
(2)贪婪匹配、非贪婪匹配使用要注意
贪婪匹配可能会回溯多次,然后非贪婪也有可能回溯多次。所以要设计好,当然也可以用固化分组解决这个问题。详情请看
贪婪与非贪婪原理分析
固化分组使用的好处
(3)只要能确定哪些字符范围,就不用点号;只要能够匹配重复次数,就不要用任意量词。能使用懒惰匹配就坚决不用贪婪匹配

PHP的PCRE扩展中提供了两个设置项
pack.backtrack_limit最大回溯数
pcre.recursion_limit 最大嵌套层数

在正则表达式的使用中,应尽量避免回溯次数过多的情况。但有时候如果正则表达式的回溯真的多得没法优化了。你又想提高网页响应速度。就是把上面那个最大回溯数变大一点。
(4)尽量使用字符串函数处理代替
因为字符串函数处理的效率更高
(5)合理使用括号
每使用一个普通括号,而不是非捕获型括号(?:……)。就会保留一部分内存等着再次访问。这样的正则表达式、无限次的运行次数、无异于一根根稻草的堆加。
(6)尽量多的用^$这种起头结尾标记,能更准确
(7)\d\d\d 和\d{3}。====和={4}。在PHP中这两种效率都等价。
(8)对大而全的表达式进行拆分
(9)使用正则表达式以外的解决办法


一般有这些常见应用

(1)移动手机校验
(2)E-mail地址校验
(3)转义在数据安全中的应用
这里要多说 一句话,开发中要切记“一切输入和输出都是不可靠的”理论
想数据库表单的填写我们要转义哪些引起数据库系统产生歧义的字符(php中有addslashes()函数将、 “ 、 nul等字符转义l)
在任何表达也要尽量过滤html代码。防止XSS攻击(php中有htmlspecial-chars()函数可以将任何html标签缓存其相应的实体
(4)URL重写与搜索引擎优化
一般都在服务器的重写模块。Nginx和Apache都很简单的
用URL重写实现伪静态。有很多好处:搜索引擎喜欢抓静态页面;用户也喜欢记忆简单的url;可以避免暴露采用的技术。

0 0
原创粉丝点击