php正则表达式

作者: 鲁智深 分类: PHP 发布时间: 2015-09-07 15:54

一、正则表达式的简介

正则表达式是用于描述字符排列匹配的模式的一种语法规则,主要用于字符串的匹配,查找。替换和分隔等。

在php中,正则表达式一般是有正规的字符和一些特殊的字符组成的一种文本描述

在php中,正则表达式的有三个作用:

匹配,也常常用于字符串中提取想要的字符

替换,把符合正则表达式的规则的字符替换成其他字符

将一个字符串切割一组更小的信息块

php中正则表达式的介绍:

php中给我们提供来了2套正则表达式的函数库,2种功能相近,执行效率不同

1、perl风格:”preg_”为前缀的函数

2、POSIX风格:”ereg_”为前缀的函数(php5.0后会逐渐放弃)

php正则表达式常用的函数:

preg_match();

进行正则表达式的匹配

1
2
3
4
     echo "<br/>---------------preg_match()----------<br/>";
     $str18 = "abcdefjabc";
     preg_match("/a.*c/U",$str18,$arr);
     var_dump($arr);

preg_match_all();

进行全局匹配,跟上面功能类似

preg_replace();

执行正则表达式的搜索和替换

1
2
3
4
     echo "<br/>---------------preg_replace();----------<br/>";
     $str18 = "abcdefjabc";
     $res = preg_replace("/a.*c/U","*",$str18);
     var_dump($res);

preg_split();

用正则表达式去切割字符串

1
2
3
4
     echo "<br/>---------------preg_split();----------<br/>";
     $str19 = "abcdefjabc";
     $res = preg_split("/e/",$str19);
     var_dump($res);

preg_grep();

返回与正则表达式匹配的数组单元

1
2
3
4
     echo "<br/>---------------preg_grep();----------<br/>";
     $arr = array("abc","sql3","php7");
     $res = preg_grep("/[a-zA-Z]+[0-9\.]/",$arr);
     var_dump($res);

二、正则表达式的语法规则

1、定界符

2、原子

3、元字符

4、模式修正符

语法:/表达式/模式修正符

正则表达式作为一个匹配的模版,是由原子(普通字符,例如a-z),特殊字符(元字符,+.?等)以及模式修正符

一个最简单的正则表达式至少包含一个原子 /a/

定界符:写正则表达式的时候,我们只需将需要匹配的模式内容放在定界符之间

常用的定界符://还有##、!等

原子:正则表达式的最基本组成单位

可以分为5类:

1、普通字符:a-z,A-Z,0-9

2、特殊字符和转义后的元字符\” \’ \* \+ \? \.

3、非打印字符:\n \r \t

4、通过字符类型:\d \D \w \W \s \S

5、自定义的原子:[abc]

\d:任意一个十进制数字,等于[0-9]

\D:任意一个十进制数字以为的字符。等于[^0-9]

\w:任意一个数字,字母,下划线等于[0-9a-zA-Z_]

\W:任何一个数字,字母,下划线以外的字符,等于[^0-9a-zA-Z_]比如

\s:任意一个空白符等价于[\n\r\t\v]

\S:任意一个空白符以外的字符等价于[^\n\r\t\v]

\b:匹配单词的边界

1
2
3
4
5
6
     echo "<br/>---------------\b----------<br/>";
     $str2 = "this island is a beautiful land";
     preg_match_all("/\bis\b/",$str2,$arr);
     var_dump($arr);
     preg_match_all("/\bis/",$str2,$arr);
     var_dump($arr);

\B:除了匹配单词边界以外

1
2
3
     echo "<br/>---------------\B----------<br/>";
     preg_match_all("/\Bis/",$str2,$arr);
     var_dump($arr);

三、元字符:

?:匹配0次或者1次前面的原子{0,1}

1
2
3
4
     echo "<br/>---------------?----------<br/>";
     $str3 = "colr";
     preg_match_all("/colo?r/",$str3,$arr);
     var_dump($arr);

*:匹配0次,1次或者多次其前面的原子{0,}

1
2
3
4
     echo "<br/>---------------*----------<br/>";
     $str4 = "coloooooooooor";
     preg_match_all("/colo*r/",$str4,$arr);
     var_dump($arr);

+:匹配1次或者多次前面的原子{1,}

1
2
3
4
     echo "<br/>---------------+----------<br/>";
     $str4 = "gooooooooogle";
     preg_match_all("/go+gle/",$str4,$arr);
     var_dump($arr);

. :除了换行符(\r\n)以外的任何一个字符

1
2
3
4
     echo "<br/>---------------.----------<br/>";
     $str5  = "abc";
     preg_match_all("/a.c/",$str5,$arr);
     var_dump($arr);
1
2
3
4
     echo "<br/>---------------可以匹配a开通z结尾任意不包含换行符所有字符----------<br/>";
     $str6 = "abwqewqvewq423c";
     preg_match_all("/^a.*c$/",$str6,$arr);
     var_dump($arr);
1
2
3
4
     echo "<br/>---------------.+(a-z不能匹配)----------<br/>";
     $str7 = "abwqewqvewq423c";
     preg_match_all("/^a.+c$/",$str7,$arr);
     var_dump($arr);

| :匹配2个多个正则表达式

1
2
3
4
         echo "<br/>---------------使用一个或者多个正则----------<br/>";
     $str10 = "there are many apples and prars";
     preg_match_all("/apples|prars/",$str10,$arr);
     var_dump($arr);

{n}:前面的原子出现N次,出现2次/a{2}/

{n,}:前面的原子出现N次以上

1
2
3
4
     echo "<br/>---------------至少3次----------<br/>";
     $str8 = "abwqewqvewq423c";
     preg_match_all("/^a.{3,}$/",$str8,$arr);
     var_dump($arr);

{n,m}:前面的原子出现次数在n和m之间

1
2
3
4
     echo "<br/>---------------.(匹配有限次数)(a-z不能匹配)----------<br/>";
     $str8 = "abwc";
     preg_match_all("/^a.{1,3}c$/",$str8,$arr);
     var_dump($arr);

^:匹配输入字符串的开始位置

1
2
3
4
5
     $str = "tom and me play games in the room until tom's father come in";
     $str1 = "abcdefgabcdefg";
     echo "---------------匹配输入字符串的开始位置------------<br/>";
     preg_match_all("/^tom/",$str,$arr);
     var_dump($arr);

$:匹配数组的字符串的结束位置

1
2
3
     echo "<br/>---------------匹配数组的字符串的结束位置----------<br/>";
     preg_match_all("/in$/",$str,$arr);
     var_dump($arr);

[]:匹配方括号中指定的任意一个原子

1
2
3
4
         echo "<br/>---------------可以匹配html标签 不区分大小写----------<br/>";
     $str9 = "<h2>";
     preg_match_all("/<\/?[a-zA-Z]+[a-zA-Z0-9]>/",$str9,$arr);
     var_dump($arr);

[^]:匹配除方括号中指定的原子的任意一个字符

():匹配小括号里面的原子作为一个整体的大原子

举例介绍:

例如:在字符串”tom and me play games in the room until tom’s father come in”;

原子表[]:在方括号中一组原子,彼此低位相等,且仅匹配其中的一个原子

/l[uzhishen]g/:匹配lug,lzg,lhg …..

/l[^uzhishen]g/:取反

[-]:表示连续一组顺序排列的原子

[0-9]:所有数字

[a-z]:所有小写字母

[A-Z]:所有大写字母

/[0-9a-zA-Z]/:匹配所有数字和大小写字母

/[^[a-z][0-9]]/:匹配第一个是小写字母,第二个是数字的字符型 z2

/0[xX][0-9a-fA-F]+/:匹配一个简单的十六进制 0xf,0XAa

/[^0-9a-zA-Z_]/:匹配除了数字,英文字母和下划线的一个字符

/<\/?[a-zA-Z]+[a-zA-Z0-9]>/:匹配html标签

模式选择符

在正则表达式中使用一个或者多个正则

there are many apples and prars

大原子:()

例如:you very very very very stmary中间有一个或者以上的very

/you (very )+stmary/

1
2
3
4
     echo "<br/>---------------大原子()----------<br/>";
     $str11 = "you very very very very stmary";
     preg_match_all("/you (very )+stmary/",$str11,$arr);
     var_dump($arr);

/hello (word|earth)/:hello或者hello earth

重复使用的模式单元

02-09-2015或者02/09/2015或02@09@2015

/\d{2}(\W)\d{2}\\1\d{4}/

1
2
3
4
     echo "<br/>---------------02-09-2015或者02/09/2015或02@09@2015----------<br/>";
     $str12 = "02/09/2015";
     preg_match_all("/\d{2}(\W)\d{2}\\1\d{4}/",$str12,$arr);
     var_dump($arr);

系统自动将小括号中的匹配的依次储存起来,用”\1″,”\2″,”\3″形式进行引用,并且在正则中需要用”\\1″中”\”进行转义。

匹配模式的优先级:

1、\转义字符

2、()[] 大原子和原子表

3、*+?{n}{n,}{n,m}重复匹配(匹配次数)

4、^$\b\B边界限制

5、|模式选择

模式修正符:

它可以使正则表达式有更多的含义

i:在正则匹配是不区分大小写,默认区分大小写

1
2
3
4
     echo "<br/>---------------模式修正符 i----------<br/>";
     $str13 = "abc";
     preg_match_all("/A./i",$str13,$arr);
     var_dump($arr);

x:忽略正则表达式中的空白

1
2
3
4
     echo "<br/>---------------模式修正符 x----------<br/>";
     $str14 = "abc";
     preg_match_all("/a. c/x",$str14,$arr);
     var_dump($arr);

s:是正则表达式中的.能匹配换行符

1
2
3
4
5
     echo "<br/>---------------模式修正符 s----------<br/>";
     $str15 = "ab
     c"
;
     preg_match_all("/a.*c/s",$str15,$arr);
     var_dump($arr);

m:在匹配的字符串中,如有换行,正则认为是多行

1
2
3
4
5
     echo "<br/>---------------模式修正符 m----------<br/>";
     $str16 = "ab
     c"
;
     preg_match_all("/^c/m",$str16,$arr);
     var_dump($arr);

U:不贪婪匹配(.*?)一样

1
2
3
4
     echo "<br/>---------------模式修正符 U----------<br/>";
     $str17 = "abcdefjabc";
     preg_match_all("/a.*c/U",$str17,$arr);
     var_dump($arr);

作业:

1、在cont.html中的js用正则表达式去到

2、在cont.html中去除所有p标签,留文本

3、邮箱的正则

4、手机号码正则

5、所有数组(正负整数,小数,0)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注