PHP基础复习(六)——正则表达式

前言

本系列文章主要是根据实战视频《360大牛:全面解读PHP面试》学习过程中记录的学习笔记,期间也会加入查找资料和平时学习中学习到的知识。

作用

正则表达式的作用:分割、查找、匹配、替换字符串。

 

分隔符

正斜线(/)、hash符号(#)以及取反符号(~)

 

通用原子

 \d        0-9

\D        除了0-9

\w        数字(0-9)字母(a-zA-Z)下划线(_)

\W       除了数字(0-9)字母(a-zA-Z)下划线(_)

\s         空白符

\S         除了空白符

元字符

.      匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。

*    匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

?    匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。

^   匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

$    匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

+   匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

{n}   n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}   n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}  m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

[]   字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

()   匹配 pattern 并获取这一匹配。

[^]   负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

|     匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[-]   字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

 

模式修正符

i   不区分大小写的匹配。

            如:"/abc/i"可以与abc或aBC或ABc等匹配。

m  将字符串视为多行,不管是那行都能匹配。

             模式为:$mode="/abc/m";

             要匹配的字符串为:$str="bcefg5e\nabcdfe"

             注意其中\n,换行了;abc换到了下一行;

             $str和$mode仍可以匹配,修正符m使得多行也可匹配。

e    正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用;可以把匹配来的字符串当作正则表达式执行;preg_replace() 函数在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

s    如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号。s将字符串视为单行,换行符作为普通字符。

             模式为:$mode="/pr.y/";

             要匹配字符串为:$str="pr\ny";

             两者不可匹配; . 是除了换行以外的字符可匹配;

            修改下模式为:$mode="/pr.y/s";

            其中修正符s将\n视为普通字符,即不是换行;

            最后两者可以匹配。

U  正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式。

            如模式为:

            $mode="/a.*c/";

            $str="abcabbbcabbbbbc" ;

            preg_match($mode,$str,$content);

            echo $content[0]; //输出:abcabbbcabbbbbc;

            如果$mode="/a.*c/";变成$mode="/a.*c/U";

            则只匹配最近一个字符串,输出:abc;

x  表示模式中的空白忽略不计。

A  强制从目标字符串开头匹配;以模式字符串开头,相当于元字符^。

            可以与$str="abcsdfi"匹配,

            不可以与$str2="sdsdabc"匹配;

            因为$str2不是以abc开头;

D  如果使用$限制结尾字符,则不允许结尾有换行。

            模式为:$mode="/abc$/";

            可以与最后有换行的$str="adshabc\n"匹配;

            元子符$会忽略最后的换行\n;

            如果模式为:$mode="/abc/D",

            则不能与$str="adshabc\n"匹配,

u   模式字符串被当成 UTF-8。

g   表示全局匹配。

难点考点(待补充)

        后向引用、贪婪模式

 

正则表达式PCRE函数

preg_match()    执行匹配正则表达式

语法:int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

                 搜索subject与pattern给定的正则表达式的一个匹配。

                matches

               如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

例子:

 Array ( [0] => foobarbaz [1] => 0 ) [1] => Array ( [0] => foo [1] => 0 ) [2] => Array ( [0] => bar [1] => 3 ) [3] => Array ( [0] => baz [1] => 6 ) )

 

preg_match_all()  执行一个全局正则表达式匹配

语法:int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

                  搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中。

                  在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。

 

preg_replace()   执行一个正则表达式的搜索和替换

语法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

                 搜索subject中匹配pattern的部分, 以replacement进行替换。

 

preg_split()  通过一个正则表达式分隔字符串

语法:array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

                 通过一个正则表达式分隔给定字符串.

例子:

 hypertext [1] => language [2] => programming )

 

中文匹配

UTF-8汉字编码范围是0x4e00-0x9fa5,在ANSI(gb2312)环境下,0xb0-0xf7,0xa1-0xfe 。

UTF-8要使用u模式修正符是模式字符串被当成UTF-8,在ANSI(gb2312)环境下,要使用chr将ASCII码转换成字符。

 

 

参考链接:

https://www.cnblogs.com/yuanwanli/p/5838918.html

https://blog.csdn.net/helen_shw/article/details/56011213

http://www.runoob.com/regexp/regexp-metachar.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(PHP面试)