断言(Assertions)在正则表达式概念里面难理解,它通常指的是在目标字符串的当前匹配位置进行的一种测试但这种测试并不占用目标字符串,也即不会移动模式在目标字符串中的当前匹配位置。详细可以看看,正则表达式匹配解析过程探讨分析(正则表达式匹配原理),里面提到“零宽度“很多元字符,只是对特殊位置进行匹配,它们可以理解为断言。 断言元字符 常见断言元字符有: \b, \B, \A, \Z, \z, ^ ,$ 它们只是表示特殊位置,各自作用如有字符串AB,带位置表示为:0A1B2 元字符 意义(以上面带位置字符串说明) ^ 行首,字符串首 表示位置0 $ 行尾,字符串尾部,表示位置2 \b 字分界线,可以表示:0,2位置 \B 非字分界线,可以表示1位置 ...
阅读全文
已经有多篇关于正则表达式介绍的文章,随着我们越来越多使用正则表达式,想对性能做优化、减少我们正则表达式书写匹配Bug。我们不得不进一步深入了解正则表达式执行过程了。下面我们一起学习,分析下正则表达式执行过程。我们会用regexbuddy测试工具分解执行过程,具体工具使用,可以看:正则表达式性能测试工具推荐、优化工具推荐(regexbuddy推荐)。要了解正则表达式解析过程前,我们先来熟悉几个概念。 常见正则表达式引擎 引擎决定了正则表达式匹配方法及内部搜索过程,了解它至关重要的。目前主要流行引擎有:DFA,NFA两种引擎,我们比较区分下。 引擎 区别点 DFADeterministic finite automaton 确定型有穷自动机 DFA引擎它们不要求...
阅读全文
继上几篇正则表达式相关说明(详情:正则表达式 ),我们今天继续讨论下,它的单行,多行模式使用,及容易出现错误地方。单行,多行模式,都是正则表达式的模式修饰符里面出现的参数。目前常用正则表达式都有该使用选项,如:javascript 正则表达式,一般是:”/正则表达式匹配字符/修饰符“ ,最后一个”/” 后面是修饰符。然后,php也是类似的,c#,python等,一般调用正则表达式的匹配函数,都有一个另外选项的,设置模式。 单行、多行模式容易出现理解错误 为什么说,容易出现理解错误呢,它们英文对应说明是:SingleLine ,MultiLine,刚好是单行、多行意思。因此,很多朋友就会从字面理解里面,得出以下结论:(哈哈、刚刚使用,我也是这些朋...
阅读全文
什么是正则表达式呢? 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),它是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。几乎在各种计算机编程语言中都有用到。可以分为普通正则表达式、扩展正则表达式、高级正则表达式。普通正则表达式在linux shell中常用到,高级正则表达式语法规范,基本由perl演化而来。目前常见程序语言(php,perl,python,java,c#)都支持高级正则表达式。 我们为什么要学习正则表达式? 高级程序语言的正则表达式几乎都从perl语言发展而来,因此,语法几乎一致。你学好了,一门正则...
阅读全文
接上一篇:正则表达式(regex)错误使用导致功能漏洞 ,我们继续梳理,正则表达式错误使用,导致功能设计漏洞(bug),做web方面,需要掌握的知识很多,网站开发这项工作,在国内也就10多年,很多开发人员,都是通过:培训(自学) ->模仿->做项目 ,这样一个过程。很多就是修修改改后,就成为了web开发工程师。这行入门低,很容易上手。但是想成为大师级的,还是很不容易。需要学习,掌握的知识几十门。而对于刚刚入门同人,很多时候因为缺乏系统学习,理论支持。导致提升有些心有余而力不足啦!因此,出现这些或多或少的功能设计漏洞,是很常见的! 好了,有些跑题了,在做代码走查时候,这类漏洞也是时常出现。我们看下,下面代码: &...
阅读全文
写在前面的话 正则表达式它的强大字符串匹配功能,导致目前在各种程序语言中,都非常流行!它被用来描述或者匹配一系列符合某个句法规则的字符串。很多刚刚使用正则表达式都是从听说这个,然后在要使用时候去网上搜索。 很少人一开始就系统去学习正则表达式,从定义原理使用系统学习。因为,对应初学者觉得它太麻烦了,好多原字符。看到那么长一串字符,就很头痛。因此,也懒得去学习。一般遇到问题,直接去网上搜索。如:“邮箱正则表达式,手机号正则表达式,url正则表达式…..” ,我们发现一个很有意思现象,“怎么邮箱正则表达式可以各种各样,url正则表达式也不相同“,都出都在推荐,都说自己是正确的,到底那个是正确的呢? 从各异的正则表...
阅读全文
最近工作中,时不时有用户输入自己真实姓名,然后申请银行提款时候,遇到一些特殊字符。而输入错误,提款失败!其中最多就是少数名字,姓名中的点字符。如:某某·李四,经常有人输入:某某.李四 或 某某・李四。其中:”·・” 这2个中间点很容易输入错误。都是中间点,一个大一个细。 那一个才是中文姓名中间点呢? 作为技术开发人员,我们有办法知道,到底那个点才是中文中间分割点。因为,这些都是常见姓名字符,因此,我们只要检测下,这2个字符对应在gb2312字符集中,字符编码即可。对于计算机而言,无论多怪的字符,看起来还怎么像,其实计算机本质去区分,是按照字符在字符集中,对应编码(字符编码)来保存、传输的。 因此,...
阅读全文
这个问题很多做php开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。导致通一个用户访问,另外一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面就可以读取。这个就是,我们常说的,session阻塞机制。 我用file 存放用户session session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这是,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2...
阅读全文
最近工作中遇到个问题,就是有一些资源,不希望别人很派发的抓取,这样会占用我们带宽还有资源。因此,我们对页面访问做了频率限制。这样一来,又怕搜索蜘蛛给限制了。 因此,我们有个需求,就是除了常见搜索蜘蛛,其它都要做频率限制。 工作就变成了,首先我们怎么样正确表示搜索蜘蛛。 怎么样识别搜索蜘蛛 搜索引擎基本上由最先google,和国内的baidu统一了。刚开始比较混乱,后期有很多规则协议,可以遵循。基本上一些新兴的搜索引擎在访问站点时候,都会延用google制定的一些规则。它们一般都会有特定的user-agent,但是,如果我们只通过user-agent去识别搜索蜘蛛的话,那样第三方抓取程序,都会去伪造个user-agent。变成搜索...
阅读全文
以前看了,很多框架,基本上很少使用相对路径包含。而一般很多做php web站点,喜欢用相对路径。 认为这样,无论目录放到那里。 只要跟另外目录关系一致。那么就不会出现问题。如果一个站点,一般都认为,如果用根目录,经常会改变网站地址,觉得很不方便。其实,我们从各大常见框架里面会发现,基本上都是采用是绝对路径方法。 相对路径带来问题 我们有如下结构的目录。 <web>(网站根目录)
├<a>文件夹
│ │
│ └a.php
├<b>文件夹
│ │
│ └b.php
└test.php
如果b.php 包含a.php (include(“../a/a.php”)) ,然后test.php 包含b.php (include(“b/b.php”)) ,我们发现很奇怪问题。
首先访问:b.php 可...
阅读全文