example:
输出:
3.风格正则表达式:
POSIX正则表达式
①字符类:
类 => 描述
[:alnum:] => 字母和数字字符[0-9a-zA-Z]
[:alpha:] => 字母字符[a-zA-Z]
[:ascii:] => 7位ASCII字符[\x01-\x7F]
[:blank:] => 水平空白符(空格、制表)[ \t]
[:digit:] => 数字[0-9]
[:lower:] => 小写字母[a-z]
[:upper:] => 大写字母[A-Z]
[:punct:] => 任意的标点符号[.;!#<>=+...]
[:space:] => 空白(换行、回车、制表符、空格、垂直制表符)[\n\r\t \x0B]
[:xdigit:] => 16进制数字[0-9a-fA-F]
每一个[:something:]类都可以被用于替代一个字符类中的字符。例如:要查找任一数字字符或大写字母 => [[:digit:][:upper:]]
但是不能把一个字符类当做一个范围的终点来使用:
ereg('[A-[:upper:]]','string');//非法的正则表达式
如果某个地区把某些字符序列当做一个单独的字符来考虑——————它们被称为排序序列。在字符类中匹配这些多字符序列中的一个时,要把它用[.和.]括起来。例如:[st[.ch.]]//用于匹配s、t或ch
等价类:把字符用[=和=]括起来指定,等价字符类匹配有相同整理顺序的字符。
②锚:将匹配限制在字符串中特定位置。
POSIX锚:
^ => 在字符串开始
$ => 在字符串末尾
[[:<:]] => 单词开始
[[:>:]] => 单词末尾
精确匹配某个单词:('[[:<:]]gun[[:>:]]')//精确匹配gun这个单词
③函数
POSIX风格的正则表达式有3类函数:匹配、替换和拆分。
1)匹配
ereg()函数:
原型:$found = ereg(pattern,string[,array]);
如果第三个函数指定的话就组装该数组,并根据是否存在字符串找到模式的一个匹配而返回true或false
2)替换
$changed = ereg_replace(pattern,replacement,string);
第一个参数:要替换的字符串的模式
第二个参数:要用来替换的内容
第三个参数:原字符串
返回值:原字符串被replacement替换后的字符串
3)拆分
split()函数使用正则表达式来把字符串拆分成较小的块,作为一个数组返回。如果出现错误,则split()返回false
$arr = split(pattern,string[,limit]);
第一个参数:用于匹配分隔成块的文本;
第三个参数:用于限定要拆分成多少个小块,如果设置了该值,则数组的最后一个元素会存放剩余的字符串。
返回值:子串构成的数组;
Perl兼容正则表达式
1)分隔符:
Perl风格的正则表达式模仿Perl模式的语法,即每个模式都必须用一对分隔符括起来。习惯上使用左斜杠(/),例如:/pattern/
不过任意非数字字母的字符(除了反斜杠(\))都可用于分隔一个Perl风格的模式,这在匹配包含斜杠的字符串是很有用的
后缀选项:放在结束分隔符后面的单个字符修饰符,它用于修改正则表达式引擎的行为。
后缀选项x可以让正则表达式引擎匹配前从正则表达式中跳过空白符和被#标记的注释。
下面两种方式是等价的:
1.'/([[:alpha:]]+)\s+\1/'
2.'/( # start capture'
[[:alpha:]]+ # a word
\s+ #whitespace
\1 # the same word again
) # end capture
/x'
2)匹配行为:Perl正则表达式特别为单行文字匹配进行了优化
句点(.)匹配任意除换行符(\n)之外的字符
美元符号($)匹配字符串的末尾或在换行符之前以换行符结尾的字符串
3)字符类:
Perl风格的正则表达式不仅支持POSIX字符类,还定义了一些自己的字符类。
\s => 空白符[\r\n \t]
\S => 非空白符[^\r\n \t]
\w => 单词字符[0-9a-zA-Z_]
\W => 非单词字符[^0-9a-zA-Z_]
\d => 数字[0-9]
\D => 非数字[^0-9]
4)锚
\b => 单词边界(在\w和\W之间或在字符串开头或末尾)
\B => 非单词边界(在\w和\w或\W和\W之间)
\A => 字符串开头
\Z => 字符串末尾或在末尾的\n之前
\z => 字符串末尾
^ => 行的开头(或如果/m标志启用的话在\n之后)
$ => 行的末尾(或如果/m标志启用的话在\n之前)
5)量词和贪婪性
Perl也支持POSIX的量词,而且是具有贪婪性(当有一个量词时,引擎在仍然满足匹配模式的情况下尽可能多的进行匹配)的。
preg_match('/(<.*>)/','do not press the button',$match);//在这里、和not都满足匹配条件,但是根据贪婪性原则,匹配的内容为not
在你需要使用最少匹配(非贪婪匹配)的时候可以使用非贪婪量词
Perl提供了一组用于最小匹配的量词(在普通量词(普通量词默认为贪婪量词)的基础上附加一个?号)
贪婪量词 => 非贪婪量词
? => ??
* => *?
+ => +?
{m} => {m}?
{m,n} => {m,n}?
{m,} => {m,}?
preg_match('/(<.*>)/','do not press the button',$match);//在这里$match为
另外一个更快的方法是使用一个字符类来匹配每个非大于字符到下一个大于字符:
preg_match('/(<[^>]*>)/','do not press the button',$match);
6)非捕获匹配
如果把模式的一部分用小括号括起来,那么匹配子模式的文本被捕获并且可以在后面访问。
如果你想创建一个不捕获匹配文本的子模式,那么在Perl兼容正则表达式中可以使用(?:subpattern)结构
preg_match('/(?:ello)(.*)/','jello giafra',$match);//这里$match[1]是' biafra',而不是子模式(?:ello)匹配的ello,表明第一个子模式的匹配文本没有被捕获
7)逆向引用:可以使用一个逆向引用来引用模式中之前被捕获的字符串;\1引用第一个子模式的内容,\2引用第二个,以此类推。如果嵌套了子模式,那么第一个引用以第一个左小括号开始,第二个引用以第二个左小括号开始,以此类推,不能捕获超过99个子模式
preg_match('/([[:alpha:]]+)\s+\1/','Paris in the the spring',$m);//$m[1]是'the'
8)后缀选项
Perl风格的正则表达式允许把单个字符选项(标志)放在正则表达式模式后面来修改匹配的解释或行为。
/i => 不区分大小写的匹配
/s => 使句点(.)匹配任何字符,包括换行符(\n)
/x => 从模式中删除空白符和注释
/m => 使^匹配换行符(\n)之后的内容,$匹配换行符(\n)之前的内容
/e => 如果替换字符串是PHP代码,使用eval()执行该代码来得到实际的替换字符串
PHP的Perl兼容正则表达式也支持在Perl中不支持的其他修饰符
/U => 颠倒子模式的贪婪性;*和+尽可能少地匹配而不是尽可能多
/u => 把模式字符串当做UTF-8编码对待
/X => 如果反斜杠之后跟着没有特殊意义的字符,将产生一个错误
/A => 把锚定位在字符串的开头就像模式中有^一样
/D => 使$字符仅匹配一行的末尾
/S => 使表达式解析器更加小心的检查模式的结构,使得第二次(例如:在循环中)运行时加快速度
在一个子模式中可以同时使用多个选项:/****
9)内联选项
除了在模式结束分隔符之后指定模式选项之外,还可以在一个模式内部指定仅运用于部分模式的选项
语法:(?flags:subpattern)
preg_match('/I like (?i:PHP)/','I like pHp');//在这个实例中只有单词PHP是不区分大小写的
i、m、s、U、x和X选项可被用在这种方式内部。一次可以使用多个选项。
preg_match('/eat (?ix:fo o d)/','eat FoOD');//true
一个选项前如果有连字符(-)表示关闭此选项
preg_match('/I like (?-i:PHP)/','I like pHp');//false
内置标志不能用于捕捉字符串,需要设置一个附加的小括号来完成捕捉。
preg_match('/I (like (?i)PHP) a lot/','I like pHp a lot',$match);//$match为like pHp
10)前向和后向断言(看不懂,暂时跳过)
11)剪切(一次性子模式),可以防止正则表达式在对待某些类型的模式时出现最坏的情况,一旦匹配,正则表达式就不会回溯子模式。
剪切不会改变匹配的结果,只是让程序能尽快运行结束。
12)条件表达式:在正则表达式中条件表达式就像一个if语句。
一般格式为:(?(condition)yespattern)//如果条件成立,就试图匹配yespattern
(?(condition)yespattern|nopattern)//如果条件成立,就试图匹配yespattern,否则,就尝试匹配nopattern
断言可以是两种类型中的一种:逆向引用或前向和后向匹配