2015-05-27
我们使用正则表达式,熟练掌握各种功能和结构只是手段,解决实际的问题才是真正的目的。要解决真正的问题,就必须有解决问题的思路,正则表达式的功能,说到底,可以归纳为三种逻辑,为了表述方便,我们分别称为与、或、非。
最近用CI在做个人工资管理系统的时候,需要验证用户是否登录和使用特定的功能,用到了正则表达式-非。需求如下:
路径/user, /user/login, /user/register不需要进行拦截,其实诸如/profile, /company, /work的路径都要拦截,然后检查session中是否存在user_id,没有的话就跳转到/user/login
初步观察:
只要对/user进行匹配就行了。初步代码如下:
01
<?php
02
class Acl {
03
04
private $CI;
05
06
public function __construct() {
07
$this->CI = &get_instance();
08
}
09
10
public function auth() {
11
if (!preg_match('/^user.*$/', uri_string())) {
12
$user_id = $this->CI->session->userdata('user_id');
13
if(empty($user_id)) {
14
redirect('/user');
15
return;
16
}
17
}
18
}
19
}
测试的时候才发现漏了检测user/change_password,这个功能是需要客户首先登录的,这里就要在user.*中排除user/change_password的,也就是前面说的要用到正则中的“非”。
“非”是正则表达式中最难处理的逻辑关系。因为没有直接对应的结构,“非”的处理比较吃力。
最简单的“非”,意思是此处不能出现某个字符,这一点通常很直观,似乎用排除型字符组[^…]就可以解决。比如双引号字符串的匹配,首尾两个双引号很容易匹配,其中的内容肯定不是双引号(暂时不考虑转义的情况),所以可以用[^"]表示即可,其长度不确定,所以用*来限定,所以整个表达式就是"[^"]*",非常简单。
但是,事情果真都如此简单吗?我们举cat和cut的例子,如果希望匹配c开头,t结尾的单词,但不希望匹配cut,可以写成c[^u]t,是否就可以了?
这个表达式的意思是:最开头的字母是c,之后是一个不为u的字符,之后是t。没错,它确实不会匹配cut,也可以匹配cat。但是,chart、conduct、court等等,它也没法匹配,因为[^u]的意思是:匹配一个不是u的字符。
那么,把[^u]改成[^u]+好了,这样应该就可以解决问题了。但是真的如此吗?[^u]+的意思是,一个或若干(最多到无穷)个字符,但每一个字符都不能是u。所以,尽管c[^u]+t能匹配cat和chart,却不能匹配conduct和court。
其实cut和我的路径匹配问题可以用顺序否定环视功能来解决。
(?!cut)就是用来进行这种判断的,它判断之后的字符串能不能由cut匹配,也不会移动“当前位置”。所以我们将它放在表达式的最开头,得到(?!cut)c[a-z]+t。这个表达式的逻辑是:只有在当前位置右侧字符串不能由cut匹配的情况下,才从这里开始,向右尝试用c[a-z]+t。
如果我们更进一步,需要排除掉cat和cut,可以把否定顺序环视改为(?!c[au]t)。这样就能保证,匹配到的肯定不是cat或者cut。www.zhishiwu.com
回到最上面的问题。直接上代码吧,代码如下:
01
<?php
02
class Acl {
03
04
private $CI;
05
06
public function __construct() {
07
$this->CI = & get_instance();
08
}
09
10
public function auth() {
11
if (!preg_match('/^(?!user//change_password)user.*$/', uri_string())) {
12
$user_id = $this->CI->session->userdata('user_id');
13
if(empty($user_id)) {
14
redirect('/user');
15
return;
16
}
17
}
18
}
19
}
作者:kxt
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
常用dos命令及语法
2014-09-27
PHP中include和require区别之我见
2014-09-05
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
麻将大师消消乐下载v1.0.9 安卓版
其它手游 24.95MB
下载
我是武林盟主最新版下载v6.1.12 安卓版
其它手游 64.04MB
下载
我的忍者村官方版下载v1.0.5 安卓版
其它手游 149.24MB
下载
我的生存计划最新版下载v1.0.0 安卓版
其它手游 139.77MB
下载
探险者生存日记游戏下载v300.1.1.3018 安卓版
其它手游 78.94MB
下载
多多糖果屋下载v2.3.02 安卓版
其它手游 40.54MB
下载
恐怖文字逃脱最新版下载v1.0.2 安卓版
其它手游 155.66MB
下载
超市收纳达人下载v1.0.3 安卓版
其它手游 26.09MB
下载魔力大师下载v1.1.3 安卓版
下载
正常的大冒险手机版下载v3.7.5 安卓最新版
下载
螺丝钉解谜下载v1.19 安卓版
下载
死灵法师手游下载v5.7 安卓版
下载
沙雕的鹿最新版下载v1.0.0 安卓版
下载
消灭马桶人游戏最新版下载v1.0.4 安卓版
下载
熊出没的五夜后宫游戏下载v3.0 安卓版
下载
黄金矿工经典版教育下载v1.7 安卓版
下载