辛星教你高速掌握PHP的正則表達式

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

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

1.就如同xml、json、cookie、session、get、post等话题一样。正則表達式是一个跨越了语言的话题。差点儿绝大多数语言都支持正則表達式。能够说。仅仅要这门语言支持字符串,它就应该支持正則表達式,由于非常多功能不使用正則表達式特别麻烦 ,可是使用了正則表達式就非常easy。

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

3.因此,学好正則表達式,不论将来转学哪门语言,都是很easy的。


*************正則表達式的作用**********

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则必须不能出如今开头或者结尾,仅仅能出如今中间部分。

2.事实上能够看出^和$是一对反义词,而和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.我们每到一定的时间就温习一次。






















原文地址:https://www.cnblogs.com/lxjshuju/p/6823518.html