PHP学习八--正则表达式

什么是正则表达式:正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。

使用正则表达式的目的是为了实现比字符串处理函数更加灵活的处理方式,因此跟字符串处理函数一样,其主要用来判断子字符串是否存在、字符串替换、分割字符串、获取模式子串等。

正则表达式中具有特殊含义的字符称之为元字符,常用的元字符有:

一般用于转义字符
^ 断言目标的开始位置(或在多行模式下是行首)
$ 断言目标的结束位置(或在多行模式下是行尾)
. 匹配除换行符外的任何字符(默认)
[ 开始字符类定义
] 结束字符类定义
| 开始一个可选分支
( 子组的开始标记
) 子组的结束标记
? 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词)
* 量词,0 次或多次匹配
+ 量词,1 次或多次匹配
{ 自定义量词开始标记
} 自定义量词结束标记

正则表达式中每个元字符匹配一个字符,当使用+之后将会变的贪婪,它将匹配尽可能多的字符,但使用问号?字符时,它将尽可能少的匹配字符,既是懒惰模式。

贪婪模式:在可匹配与可不匹配的时候,优先匹配

//下面的d表示匹配数字
$p = '/d+-d+/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678

懒惰模式:在可匹配与可不匹配的时候,优先不匹配

$p = '/d?-d?/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0];  //结果为:0-1

当我们确切的知道所匹配的字符长度的时候,可以使用{}指定匹配字符数

$p = '/d{3}-d{8}/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678

1.行定位符

^表示行的开始,$表示行的结尾。

^tm表达式表示要匹配tm开头的字符串。

tm$则匹配tm结尾的字符串。

使用tm可以匹配在字符串中出现的任意位置。类似html、utmost都可以找出来。

2.单词界定符

如果需要匹配单词tm,而不是单词的一部分,那么就不用使用tm了。这时可以使用单词界定符/b,表示要查找的字符串为一个完整的单词。

tm

如果是一个大写的B,如B,那么他的意思和相反。他匹配的字符串不能是一个完整的单词,而是其他单词的一部分。如BtmB。

3.字符类[]

正则表达式是区分大小写的,如果要忽略大小写可以使用方括号表达式[],只要匹配的字符串出现在方括号内,即表示匹配成功。但是一个方括号只能匹配一个字符。比如字符串tm要匹配的字符串不区分大小写,那么表达式应该写成:[Tt][mM]

4.选择字符串|

选择字符串可以理解为或T|tM|m,该表达式的意思是以字母T或t开头,后面接一个字字母M或m。

5.连字符-

连字符可以表示字符的范围。如[a-zA-Z]表示[a,b,c,d.....A,B,C.....Z];

6.排除字符[^]

将^放到[]内就表示排除的意思,如[^a-zA-Z]表示不以字母和下划线开头的变量名。

7.限定符(?*+{n,m})

限定符主要是在重复出现的字母或字符串中来表示的。限定符主要有6种类型

限定符 

说明 举例
匹配前面的字符零次或一次 colou?r,该表达式可以匹配color和colour
+ 匹配前面的字符一次或多次 go+gle,该表达式可以匹配的范围从gogle到gooooo....gle
* 匹配前面的字符零次或多次 go*gle,该表达式可以匹配的范围从ggle到goo....gle
{n} 匹配前面的字符n次

go{2}gle,该表达式只匹配google                        

{n,} 匹配前面的字符最少n次 go{n,}gle,该表达式可以匹配的范围从google到goo...gle
{n,m} 匹配前面的字符最少n次,最多m次。

employe{0,2},该表达式可以匹配employ,employe,employee3种情况  

8.点好字符.

点字符(.)可以匹配出换行符外的任意一个字符。例如:匹配以s开头、t结尾、中间包含一个字母的单词。^s.t$  它匹配的单词包括sat,set,sit等。

例如它的第一个字母为r,第三个字母为s,最后一个字母为t。那么该表达式为^r.s.*t$

9.转义字符()

将特殊字符变为转义字符,如显示特殊字符.则用.

10.括号字符()

小括号的第一个作用是可以改变限定符的作用范围。如(thir|four)th。这个表达式的意思是匹配单词thirth和fourth。

第二个作用是分组。

11.反向引用

依靠表达式的'记忆'功能来匹配连续出现的或字母。如连续匹配两个it。

12.模式修饰符

模式修正符号功能描述
i 在和正则匹配是不区分大小写
m 将字符串视为多行。默认的正则开始“^”和结束“$”将目标字条串作为一单一的一“行”字符(甚至其中包括换行符也是如此)。如果在修饰符中加上“m”,那么开始和结束将会指点字符串的每一行的开头就是“^”结束就是“$”。
s 如果设定了这个修正符,那么,被匹配的字符串将视为一行来看,包括换行符,换行符将被视为普通字符串。
x 忽略空白,除非进行转义的不被忽略。
e 只用在preg_replace()函数中,在替换字符串中逆向引用做正常的替换,将其(即“替换字符串”)作为PHP代码求值,并用其结果来替换所搜索的字符串。
A 如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说”/a/A”匹配”abcd”。
D 模式中的$字符权匹配目标字符的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了修正符m则忽略此项。
E 与”m”相反,如果使用这个修饰符,那么”$”将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U 贪婪模式,和问号的作用差不多,最大限度的匹配就是贪婪模式。

正则表达式的函数

1.ereg()函数和eregi()函数

ereg/eregi(string pattern,string string, [array regs]);

函数功能:在字符串string中匹配表达式pattern,如果匹配成功返回true,否则返回false。如果有第三个参数regs,则将成功匹配的字符串按子表达式划分,并储存到regs数组中。ereg区分大小写,二eregi不区分大小写。

2.ereg_replace()函数和eregi_replace()函数

ereg_replace/eregi_replace(string pattern,string replacement,string string);

函数功能:在字符串中匹配pattern。如果匹配成功,则使用replacement来替换匹配字符串,并返回string。如果未匹配成功,则返回原string。eregi_replace区分大小写

$ereg = 'tm';

$str = 'hello,tm tm tM.';

$rep_str = eregi_replace($ereg,'TM',$str);

echo $rep_str;

结果为:hello,TM,TM,TM.

2.split()函数和spliti()函数

函数格式:array split/spliti(string pattern,string string,int limit);

函数功能:使用表达式pattern来分割字符串string。  如果有参数limit,那么数组最多有limit个元素。剩余部分都写到了最后一个数组元素中。如果函数错误,则返回false。 spliti()不区分大小写。

$ereg = 'is';

$str = 'This is a register book';

$arr_str = spliti($ereg,$str);

var_dump($arr_str);

结果为:array(4){[0]=>string(2)"Th"[1]=>string(1)""[2]=>string(6)'a reg'[3]=>string(9)'ter book'}。

正则表达式的函数二

1.preg_grep()函数

函数格式: array preg_grep(string pattern,array input);

函数功能:使用数组input中的元素一一匹配表达式pattern,最后返回由所有相匹配的元素所组成的数组。

$preg = '/d{3,4}-?d{7,8}/';

$arr = array('04321234567','0431-7654321','123456789');

$preg_arr = preg_grep($preg,$arr);

var_dump($preg_arr);

结果为:array(2){[0]=>string(12) "04321234567",[1]=>string(12)'0431-1234567'};

2.preg_match()和preg_match()_all()函数

函数语法格式:int preg_match/preg_match_all(string pattern,string subject, array matches);

函数功能:在字符串subject中匹配表达式pattern。函数返回匹配的次数。如果有数组matches,那么每次匹配的结果都被存储到数组matches中。

preg_match在匹配成功后就会停止查找,而preg_match_all会一直匹配到最后才停止查找。

$str = 'This is an example!';

$preg = '/w{2}/';

$num1 = preg_match($preg,$str,$str1);

echo $num1.'<br>';

var_dump($str1);

运行结果:

array(1) {[0]=>string(2) "is"};

array(2) {[0]=>array(2){[0]=>string(2) "is" [1]=>string(2) "an"}};

3.preg_quote()函数

函数表达式:string preg_quote(string str ,string delimiter);

函数功能:该函数将字符串str中的所有特殊字符进行转义。如果有参数delimiter,那么该参数所包含的字符串也都被转义。函数返回转义后的字符串。

$str = '!,$,^';

$str2 = 'b';

$match_one = preg_quote($str,$str2);

echo $match_one;

结果为:!,$,^;

4.preg_replace()函数

函数语法格式:mixed preg_replace(mixed pattern,mixed replacement,mixed subject,int limit);

函数功能:该函数在字符串subject中匹配表达式pattern,并将匹配项替换为字符串replacement

5.preg_replace_callback();

mixed preg_replace_callback(mixed pattern,callback callback,mixed subject,int limit);

同上,callback和replacement同意。

6.preg_split();

函数语法格式:array preg_split(string pattern,string subject,int limit);

分割字符串subject。limit参数用来限制数组最多有limit个元素

原文地址:https://www.cnblogs.com/moxuexiaotong/p/6627589.html