辛星教你快速掌握PHP的正则表达式

    首先说一下,这篇文章也是我在看了数个大牛的博客之后总结出来的,因此首先向这些大牛表示崇高的敬意和感谢,由于人数众多,而且来源也是特别分散,就不一一介绍了,见谅。

************跨语言的主题**************

1.就如同xml、json、cookie、session、get、post等话题一样,正则表达式是一个跨越了语言的话题,几乎绝大多数语言都支持正则表达式,可以说,只要这门语言支持字符串,它就应该支持正则表达式,因为很多功能不使用正则表达式特别麻烦 ,但是使用了正则表达式就非常简单。

2.正则表达式可以用于邮箱、QQ、手机号等的验证,而且还可以用于采集网页,当然,说白了,正则表达式可以胜任绝大多数对于字符文本的操作,当然,对于解析xml等文件,正则表达式则显得并不是很强力,不过正则表达式对于提取xml中特定的文本信息,依然非常给力。

3.因此,学好正则表达式,不论将来转学哪门语言,都是非常简单的。


*************正则表达式的作用**********

1.正则表达式的主要作用有三个,第一个是正则匹配,第二个是正则替换,第三个是正则提取。

2.所谓正则匹配,是验证一串文本是否符合某个正则表达式规则,比如我们验证用户的是否是一个邮箱,就用到了正则匹配。

3.所谓正则替换,就是我们把文本中的某些信息给替换成另外一些信息,类似于word编辑器中的查找替换功能,快速纠错。

4.所谓正则提取,即使我们从文本中根据我们的正则表达式提取出需要的信息,比如我们从一个html文件中提取出所有的<img>标签,然后根据它的src属性来得到所有的图片的超链接,这就是从一大串文本信息中提取自己会用到的信息 。

5.我们先学习正则表达式的书写,然后在学习如何在PHP中使用正则表达式函数来操作正则表达式。


****************正则表达式的书写规则一***************

1.正则表达式通常用/来作为定界符,即两个斜线之间的部分被当做正则表达式的规则,我们用它去匹配其他的文本,比如/xinxing/这个正则表达式就表示只能比配字符串xinxing。

2.上面我们也看到了,我们的字符是可以出现在正则表达式中的,它们的作用也就是相当于匹配中的一个字符,但是,正则表达式也提供了一些元字符来让我们更加方便的来操作这些字符,这些元字符前面跟一个字符叫做前导字符,一个前导字符和一个元字符一起起作用。

3.我们用+表示其前导字符在目标中连续出现一次或多次,*表示其前导字符在目标中出现零次或者多次,而?则规定其前导对象必须在目标对象中连续出现零次或者一次,其后面的则不管了。

4.比如/xin+/可以匹配到xin,xinnnn,xinn,xinnnnn等,因为这里的+使得n可以出现一次或者多次,而xin?则可以匹配xinxing,xingui,xinguimeng等字符,只要前面有xin就可以了。

5.元字符是一种很粗糙的指定次数的方式,我们可以采用更加精细的操作,比如{m,n}表示至少出现m次,至多出现n次,{m,}表示至少出现m次,{,n}表示至多出现n次,而{t}表示出现固定的t次。

6.比如/xin{3,4}/可以匹配xinnn和xinnnn这两种情况。


**************正则表达式的书写规则二*****************

1.前面我们可以用单个的字符用来做前导字符,显然这是很弱的,我们可以有它的boss版,其中\s用于匹配单个空格符,包括制表符和换行符,\S表示用于匹配单个除了空格之外的所有字符,\d用于匹配从0到9的字符,\w用于匹配字母数字下划线,\W用于所有与\w不匹配的字符,单独的一个点号.表示撇配除了换行之外的所有字符。从上面的数据可以看出,\s和\S的意义正好相反,\w和\W也是这样。

2.比如/\s+/可以用于匹配n个空格,/\d00/可以匹配000、100、200等整百的数字。


***************正则表达式中的定位符和范围表示*********

1.正则表达式中还有所谓的定位符的说法,其中^必须出现在字符串的开头,而$则必须出现在字符串的结尾,而\b则必须出现在目标字符串的开头或者结尾,而\B则必须不能出现在开头或者结尾,只能出现在中间部分。

2.其实可以看出^和$是一对反义词,而\b和\B也是一对反义词。

3.我们可以用一个中括号括起来表示一个字符,而在里面指定范围,比如/[a-z]/表示小写字母从a到z,比如/[0-9]/表示小写字母从0到9的一个数字,比如/[a-c2-6]/表示从a到c或者从2到6的一个字母或者数字相匹配.

4.这种范围修饰符可以和元字符相连的,比如/[a-z][0-9]+/表示以一个字母作为先导,然后跟一个或者多个数字。

5.还有否定符号^用在中括号内表示的是排除,比如[^a-c]表示除去abc之外的任一字母,当^位于中括号内的时候,表示否定,当它位于中括号外的时候,被视作定位符。

6.我们通常用\表示转义符号,没错,在正则表达式中,我们也需要用\表示转义,比如\*就表示匹配*这个符号。


*****************小括号*****************

1.前面说到,元字符只能作用于其前导字符,我们可以用小括号把若干个字符括起来,作为一个整体,此时元字符就可以作用于多个字符了。

2.比如a(bc)*表示一个a后面跟着0个或者多个bc。

3.比如a(bc){0,7}表示a后面跟着0个到7个bc都可以。

4.还有一个|表示OR,即逻辑与,表示两个中选择一个。

5.比如hi|hello表示匹配hi或者hello,比如(a|b)c表示匹配ac或者bc。


**************小练习****************

1.经过我们前面的介绍,我们这里进行一下小小的演练,看看我们究竟掌握了多少。

2.其实ab*和ab{0,}表达的意思是相同的,ab?表示匹配a或者ab。



**********************备注*****************

1.上面我们讲解了正则表达式最主要的部分,还有些细枝末节没有顾忌到,下面我把比较重要的再说一下。

2.前面我们说到了用/来作为定界符,其实还可以用#作为定界符,它是在正则表达式中/出现较多的时候用的,此时正则表达式中的斜线不需要转义。

3.在正则表达式的最后加一个i表示不区分大小写。

4.我们可以分组,也有人称之为群,即Group,调用格式为(?P<组名>) 调用方式 (?P=组名)。


**************PHP函数****************

1.我们用preg_match来完成正则匹配的功能,它的第一个参数是正则表达式,第二个参数是要匹配的文本,第三个参数是可选择,表示匹配到的信息,其实它有五个参数,但是我们往往用不了那么多,如下代码示例:

<?php
//定义一个正则表达式
$reg ="/xi/";
//定义一个字符文本
$msg ="xinxisgxagxiagslgxigsghg";
//这里使用了全部匹配
preg_match_all($reg,$msg,$match);
//输出匹配到的全部信息
print_r($match);
2.上面例子的输出结果是:
Array ( [0] => Array ( [0] => xi [1] => xi [2] => xi [3] => xi ) )
3.我们可以用preg_replace来进行正则替换,比如我们用如下代码吧所有的xi都替换为了oo,代码截图:

<?php
//定义一个正则表达式
$reg ="/xi/";
//定义一个字符文本
$msg ="xinxisgxagxiagslgxigsghg";
//定义替换文本
$rep = "oo";
//这里使用了全部匹配
$str = preg_replace($reg,$rep,$msg);
//输出匹配到的全部信息
echo $str;
4.输出结果:oonoosgxagooagslgoogsghg

5.正则分割,是把原字符串通过相应的形式进行分割为数组,我们使用preg_split函数,代码示例:

<?php
//使用逗号或空格来分隔短语
$reg = "/[\s,]+/";
//定义原字符串
$msg = "hypertext language, programming";
$keywords = preg_split($reg,$msg );
print_r($keywords);
6.输出结果:

Array ( [0] => hypertext [1] => language [2] => programming )



********************总结**********************

1.正则表达式是典型的难学易忘的知识,希望可以与诸位读者共勉。

2.我们每到一定的时间就温习一次。






















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。