解析posix与perl标准的正则表达式区别


Posted in PHP onJune 17, 2013

正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本 内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由 Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科)

PHP同时使用两套正则表达式规则,一套是由电气和电子工程师 协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。

使用POSIX兼容规则的函数有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

使用PERL兼容规则的函数有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

定界符:

POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。

PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符

修正符:

POSIX兼容正则没有修正符。

PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):

i (PCRE_CASELESS):
匹配时忽略大小写。

m(PCRE_MULTILINE):
当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。

s(PCRE_DOTALL):
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

x(PCRE_EXTENDED):
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。

e:
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

A(PCRE_ANCHORED):
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。

S:
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的默认匹配成为贪婪状态的。

X(PCRE_EXTRA):
模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。

u(PCRE_UTF8):
模式字符串被当成UTF-8。

逻辑区隔:
POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:
[]:包含任选一操作的相关信息。
{}:包含匹配次数的相关信息。
():包含一个逻辑区间的相关信息,可被用来进行引用操作。
|:表示“或”,[ab]和a|b是等价的。

元字符与“[]”相关:

有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。

POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:
\ 有数种用途的通用转义符
^ 匹配字符串的开头
$ 匹配字符串的结尾
? 匹配0或者1
* 匹配 0 个或多个前面指定类型的字符
+ 匹配 1 个或多个前面指定类型的字符

POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:
. PERL兼容正则匹配除了换行符外的任意一个字符
. POSIX兼容正则匹配任意一个字符

POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:
\ 有数种用途的通用转义符
^ 取反字符,但仅当其为第一个字符时有效
- 指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ\\^_`abc]

POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:
- POSIX兼容正则中[a-c-e]的指定会抛出错误。
- PERL兼容正则中[a-c-e]的指定等价于[a-e]。

匹配次数与“{}”相关:
POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:
{2}:表示匹配前面的字符2次
{2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配
{2,4}:表示匹配前面的字符2次或4次

逻辑区间与“()”相关:
使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:
<?php
$str = "http://www.163.com/";
// POSIX兼容正则:
echo ereg_replace("(.+)","<a href = \\1 >\\1</a>",$str);
// PERL兼容正则:
echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
// 显示两个链接
?>

在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。

类型匹配:
POSIX兼容正则:
[:upper:]:匹配所有的大写字母
[:lower:]:匹配所有的小写字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和数字
[:digit:]:匹配所有的数字
[:xdigit:]:匹配所有的十六进制字符,等价于[0-9A-Fa-f]
[:punct:]:匹配所有的标点符号,等价于 [.,"'?!;:]
[:blank:]:匹配空格和TAB,等价于[ \t]
[:space:]:匹配所有的空白字符,等价于[ \t\n\r\f\v]
[:cntrl:]:匹配所有ASCII 0到31之间的控制符。
[:graph:]:匹配所有的可打印字符,等价于:[^ \t\n\r\f\v]
[:print:]:匹配所有的可打印字符和空格,等价于:[^\t\n\r\f\v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配单词的开始
[:>:]:匹配单词的结尾

PERL兼容正则(这里可以看出PERL正则的强大):
\a alarm,即 BEL 字符('0)
\cx "control-x",其中 x 是任意字符
\e escape('0B)
\f 换页符 formfeed('0C)
\n 换行符 newline('0A)
\r 回车符 carriage return('0D)
\t 制表符 tab('0)
\xhh 十六进制代码为 hh 的字符
\ddd 八进制代码为 ddd 的字符,或 backreference
\d 任一十进制数字
\D 任一非十进制数的字符
\s 任一空白字符
\S 任一非空白字符
\w 任一“字”的字符
\W 任一“非字”的字符
\b 字分界线
\B 非字分界线
\A 目标的开头(独立于多行模式)
\Z 目标的结尾或位于结尾的换行符前(独立于多行模式)
\z 目标的结尾(独立于多行模式)
\G 目标中的第一个匹配位置

PHP 相关文章推荐
下载文件的点击数回填
Oct 09 PHP
PHP中的cookie不用刷新就生效的方法
Feb 04 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
php定时执行任务设置详解
Feb 06 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
php使用post数组的键值创建同名变量并赋值的方法
Apr 03 PHP
php连接oracle数据库的方法(测试成功)
May 26 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 #PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 #PHP
CodeIgniter图像处理类的深入解析
Jun 17 #PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 #PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 #PHP
php之CodeIgniter学习笔记
Jun 17 #PHP
apache配置虚拟主机的方法详解
Jun 17 #PHP
You might like
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
PHP安全性漫谈
2012/06/28 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
javascript获取网页宽高方法汇总
2015/07/19 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
python查找第k小元素代码分享
2013/12/18 Python
python读取oracle函数返回值
2016/07/18 Python
Python中的日期时间处理详解
2016/11/17 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
django项目搭建与Session使用详解
2018/10/10 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
家长寄语大全
2014/04/02 职场文书
爱牙日活动总结
2014/08/29 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
2014年销售部工作总结
2014/12/01 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
python实现简单聊天功能
2021/07/07 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python