php中的正则表达式为什么会和Perl、POSIX扯上关系
发布时间:2025-05-25 05:02:10 发布人:远客网络
一、php中的正则表达式为什么会和Perl、POSIX扯上关系
一直以来,Perl被视为正则表达式的标准,它提供一种全面的正则表达式语言。php就按这个Perl正则标准来制定的。
在PHP手册里Perl兼容正则表达式函数的第一句就是这样说的:“本类函数中所使用的模式极其类似 Perl。”注意是“极其类似”。
Perl和POSIX很多都是相同的,因为Perl是由POSIX派生来的。
所以PHP都可以使用两套正则表达式规则,一是POSIX 1003.2定义的正则;二是PCRE库提供PERL兼容正则。
二、Linux正则表达式
在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:
1.grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
2.egrep:扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
3.fgrep:快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可以并行匹配多个字符串的版本。
grep [options...] pattern-spec [files...]
-E:使用扩展正则表达式进行匹配, grep-E或取代 egrep命令。
-F:使用固定字符串进行匹配, grep-F或取代传统的fgrep命令。
-e:通常第一个非选项的参数认为是要匹配的模式,也可以同时提供多个模式,只要将其放入单引号,并用换行字符分隔他们。
模式以减号开头时,为防止混淆其为选项,-e选项说明其后的参数为模式,即使他以减号开头。
-f:从pat-file文件读取模式作为匹配。
-l:列出匹配模式的文件名称,而不是打印匹配的行。
-q:静默的,如果匹配成功,不将匹配的行输出到标准输出;否则即是不成功。
-s:不显示错误信息,通常与-q并用。
说明:可以同时查找多个文件中的内容,当指定多个文件时,每个显示出的文件行前会有文件名加一个冒号标识其来自哪个文件。
可以使用多个-e或-f选项,建立要查找的模式列表。
(1).一般字符:没有特殊意义的字符
(2).特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
2.如下讲下正则表达式中的常见meta字符
(1).POSIX BRE与ERE中都有的meta字符:
\ : 通常用于打开或关闭后续字符的特殊含义,如\(...\)与\{...\}
. : 匹配任何单个字符(除NUL)
* : 匹配其前的任何数目或没有的单个字符,例: . 表示任一字符,则.*匹配任一字符的任意长度
^ : 匹配紧接着的正则表达式,BRE中仅在正则表达式的开头有特殊的含义,ERE中在任何位置都有特殊含义
$ : 匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义
[] : 匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符,
\{n,m\}:区间表达式,匹配在它前面的单个字符重现的次数区别。\{n\}指重现n次;\{n,m\}指重现n至m次;
\(\):保留空间,可以将最多9个独立的子模式存储在单个模式中。如\(ab\).*\1:指匹配ab组合的两次重现,中间可存在任意数目的字符。
\n:重复在\(与\)方括号内第n个子模式至此点的模式。
{n,m}:与BRE的\{n,m\}功能相同
+:匹配前面正则表达式的一个或多个扩展
?:匹配前面正则表达式的零个或一个扩展
():匹配方括号括起来的正则表达式群
[::alnum]:数字字符[:digit:]:数字字符[:punct:]:标点符号字符
[:alpha:]:字母字符[:graph:]:非空格字符[:space:]: 空格字符
[:blank:]:空格与定位字符[:lower:]:小写字母字符[:upper:]:大写字母字符
[:cntrl:]:控制字符[:print:]:可显示的字符[:xdigit:]: 16进制数字
指将多个字符视为一个符号,如[.ch.]即将ch视为一个符号
认为多个字符相等,如[=e=]在法文的locale里,可匹配于多种与e相似的字符,此处不再列出。
说明:这三种构造除其自身的方括号之外,还必须使用额外的方括号括起来。
例: [[:alpha:]!]:匹配任一英文字母或感叹号。
[[.ch.]:匹配ch排序元素,而不匹配单独的字母c或h.
3.简单正规表达式匹配案例
china : 匹配此行中任意位置有china字符的行
^china :匹配此以china开关的行
^china$:匹配仅有china五个字符的行
[Cc]hina:匹配含有China或china的行
Ch.na:匹配包含Ch两字母并且其后紧跟一个任意字符之后又有na两个字符的行
Ch.*na:匹配一行中含Ch字符,并且其后跟0个或者多个字符,再继续跟na两字符
如下通过常用实例来学习BRE和ERE匹配,源文件url.txt内容如下:
匹配以http或者https开头,并且其后为:并且含有.的串
grep'^https\{0,1\}.*\..*' url.txt
grep-E '^https?.*\..*' url.txt
匹配以字母数字或者下划线开头的多个字符,其后有一个@之后有多个字母数字或者下划线,其中有一个.号
grep'^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*\..*' email.txt
转自嘉为教育-rhce认证_rhce培训_linux培训_linux认证_linux考证
三、PHP正则表达式的使用技巧
1、用于描述字符排列和匹配模式的一种语法规则它主要用于字符串的模式分割匹配查找及替换操作
2、 PHP中有两套正则函数两者功能差不多分别为
3、一套是由PCRE(Perl Compatible Regular Expression)库提供的使用 preg_为前缀命名的函数
4、一套由POSIX(Portable Operating System Interface of Unix)扩展提供的使用以 ereg_为前缀命名的函数(POSIX的正则函数库自PHP以后就不在推荐使用从PHP以后就将被移除)
5、由于POSIX正则即将推出历史舞台并且PCRE和perl的形式差不多更利于我们在perl和php之间切换所以这里重点介绍PCRE正则的使用
6、 PCRE全称为Perl Compatible Regular Expression意思是Perl兼容正则表达式
7、在PCRE中通常将模式表达式(即正则表达式)包含在两个反斜线/之间如/apple/
8、正则中重要的几个概念有元字符转义模式单元(重复)反义引用和断言这些概念都可以在文章[ ]中轻松的理解和掌握
9、/b匹配单词的边界//bis/匹配头为is的字符串/is/b/匹配尾为is的字符串//bis/b/定界
10、/B匹配除单词边界之外的任意字符//Bis/匹配单词 This中的 is
11、/D匹配除数字以外任何一个字符等价于[^ ]
12、/w匹配一个英文字母数字或下划线等价于[ a zA Z_]
13、/W匹配除英文字母数字和下划线以外任何一个字符等价于[^ a zA Z_]
14、/s匹配一个空白字符等价于[/f/t/v]
15、/S匹配除空白字符以外任何一个字符等价于[^/f/t/v]
16、/f匹配一个换页符等价于/x c或/cL
17、/t匹配一个制表符等价于/x/或/cl
18、/v匹配一个垂直制表符等价于/x b或/ck
19、模式修正符(Pattern Modifiers)
20、模式修正符在忽略大小写匹配多行中使用特别多掌握了这一个修正符往往能解决我们遇到的很多问题
21、 S-将字符串视为单行换行符做普通字符看待使匹配任何字符
22、 e-将替换的字符串作为表达使用
23、格式/apple/i匹配 apple或 Apple等忽略大小写/i
24、/^/d{}([/W])/d{}///d{}$匹配//等字符串但上述正则表达式不匹配/的格式这是因为模式 [/W]的结果/已经被存储下个位置/引用时其匹配模式也是字符/
25、当不需要存储匹配结果时使用非存储模式单元(?)
26、例如/(?:a|b|c)(D|E|F)// g/将匹配 aEEg在一些正则表达式中使用非存储模式单元是必要的否则需要改变其后引用的顺序上例还可以写成/(a|b|c)(C|E|F)/ g/
27、 preg_match()和preg_match_all() preg_quote() preg_split() preg_grep() preg_replace()
28、函数的具体使用我们可以通过PHP手册来找到下面分享一些平时积累的正则表达式
29、$str=;$match=; preg_match_all(//s+action=/(?!)(*?)//s/$str$match); print_r($match);
30、/*** replace some string by callback function**/ function callback_replace(){$url=;$str=;$str= preg_replace(/(?<=/saction=/)(?!)(*?)(?=//s)/e search(/$url//)$str); echo$str;} function search($url$match){ return$url/$match;}
31、$match=;$str= xxxxxx cn bold font paragraph text
32、; preg_match_all(/(?<=<(/w{})>)*(?=<///>)/$str$match); echo匹配没有属性的HTML标签中的内容; print_r($match);
33、$form_= preg_replace(/(?<=/saction=/|/ssrc=/|/s)(?!|javascript)(*?)(?=//s)/e add_url(/$url////)$form_);