05月
19
正则的学习与应用(pcre)
文章分类:PHP 查看次数:451 + 92
为什么选择 PCRE(PERL REGULAR)而不是POSIX RE(POSIX REGULAR),因为在大多数的情况下,PCRE的运行速度总是要快于POSIX RE,而且有时候是快很多。
为什么要学习正则,因为正则实在是太强大了,比如这篇文章的发布就与正则有关。乍一看,正则总是让人看着很头大,但是细一看,会发现,其实正则还是很美的,:)
我也是个初学者,所以只是分享一下我学习的过程,我觉得学正则,最重要的就是不要怕,不要怕那些"乱七八糟"的符号。
OK,进入正题喽!
先来简单说一下各个符号的作用(可以在 php manual中找到更详细的说明)
有数种用途的通用转义符
^断言目标的开头(或在多行模式下行的开头,即紧随一换行符之后)
$断言目标的结尾(或在多行模式下行的结尾,即紧随一换行符之前)
.匹配除了换行符外的任意一个字符(默认情况下)
[字符类定义开始
]字符类定义结束
|开始一个多选一的分支
(子模式开始
)子模式结束
?扩展 ( 的含义,也是 0 或 1 数量限定符,以及数量限定符最小值
*匹配 0 个或多个的数量限定符
+匹配 1 个或多个的数量限定符
{最少/最多数量限定开始
}最少/最多数量限定结束
模式中方括号内的部分称为“字符类”。字符类中可用的元字符为:
\
通用转义字符
^排除字符类,但仅当其为第一个字符时有效
-指出字符范围
]结束字符类
还是来个demo吧,假如有以下这么一个文本文件
姓名:刘一|地址:刘一的家庭地址|邮箱:liuyi@gmail.com
姓名:马二|地址:马二的家庭地址|邮箱:maer@gmail.com
姓名:张三|地址:张三的家庭地址|邮箱:zhangsan@gmail.com
姓名:李四|地址:李四的家庭地址|邮箱:lisi@gmail.com
姓名:王五|地址:王五的家庭地址|邮箱:wangwu@gmail.com
姓名:赵六|地址:赵六的家庭地址|邮箱:zhaoliu@gmail.com
姓名:孙七|地址:孙七的家庭地址|邮箱:sunqi@gmail.com
姓名:黄八|地址:黄八的家庭地址|邮箱:huangba@gmail.com
姓名:钱九|地址:钱九的家庭地址|邮箱:qianjiu@gmail.com
姓名:吴十|地址:吴十的家庭地址|邮箱:wushi@gmail.com
我们要分离出各个人的姓名、地址、和邮箱,OK!入手
乍一看,挺简单的,还是思考一下吧
经过思考之后,我觉得不用正则会比较快一点:)
the code
$fp = fopen($dest_file,"r");
$num = 0;
while(!feof($fp)){
$buffer = fgets($fp,4096);
$match[$num++] = explode("|",$buffer);
for($i=0;$i<count($match[$num-1]);$i++){
$tmp = explode(":",$match[$num-1][$i]);
echo $tmp[0]."-".$tmp[1]."<br>";
}
echo "*************************************<br>";
}
fclose($fp);
这里关键的一个函数是fgets,它的作用是取出一行的内容,以字符串的形式返回,然后分别以"|"和":"作为分隔符执行explode,这样就得到了所需的数据了。
好,这次我们来真正的接触一下正则的应用
i.e.假设有这么一个url
我们要取得blueidea.com
//下面这段代码的意思就是匹配以"http://"开始("/"需要转义),在接下来的字符串中以"/"作为结束符
//括号是将符合括号里面的正则添加到$match数组中
//"/i"是忽略大小
//+号是指前面的表达式出现一次或多次
//方括号里的"^"表示取反
//"/.../"是休止符
//可以修改patten,来看看效果
$patten = "/^http:\/\/([^\/]+)/i";
preg_match($patten,$url,$match);
//"$"表示从尾部开始匹配
//"."需要转义
$patten1 = "/[^\.]+\.[^\.]+$/";
preg_match($patten1,$match[1],$match1);
echo $match1[0];
//一步到位的话
//下面这句话的兼容性不比上面
$patten = "/^http:\/\/[^\.]+\.([^\.]+\.[^\.\/]+)/i";
preg_match($patten,$url,$match);
echo $match[1];
下面来取得thread-2746458-1-1
//从尾部匹配比较方便
//"{}"大括号里的数字表示前面表达式的长度
//"[]"中括号里的字符表示可选的字符
$patten = "/([^\/]+)\.[a-z]{2,4}$/";
preg_match($patten,$url,$match);
echo $match[1];
最后再来取得参数2746458,1,1
echo "<pre>";
print_r($param);
echo "
";
上面的几个例子中,并不是什么地方都用到了正则,有时候也可以用其他的方式替换,所以要灵活应用。
相关文章
评论
发表评论

