本系列文章主要是根据实战视频《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 表示全局匹配。
后向引用、贪婪模式
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