[總結]PHP正則表達式

一.正則表達式基礎

1.什麼是正則表達式

正則表達式是字符串搜索和匹配的工具

2.無孔不入的正則表達式

我們日常生活中使用的很多電子設備,無時無刻不在跟正則表達式打交道。

1.windows的文件搜索功能:
這裏寫圖片描述

*.zip就是一種正則表達式的匹配

2.註冊時的手機號碼格式的驗證
這裏寫圖片描述

3.正則表達式的使用範圍

不管你是使用PHP,還是Java,還是Js.都會用到正則表達式。
正則表達式,基本通用於各個編程語言,各個操作系統。

二.PHP中的正則函數

1.preg_match()與preg_match_all()

preg_match($pattern,$subject,$arr)(只匹配一次,匹配到就結束)
preg_match_all($pattern,$subject,$arr)(匹配到字符串結束)pref
返回值:都返回匹配到的次數(未匹配到返回0)

<?php 
$pattern="/[0-9]/";
$subject="weur3ui7";
preg_match($pattern,$subject,$m1);
preg_match_all($pattern,$subject,$m2);
print_r($m1);//Array ( [0] => 3 )
print_r($m2);//Array ( [0] => Array ( [0] => 3 [1] => 7 ))

2.preg_replace與preg_filter()

preg_replace($pattern,$replacement,$subject)
preg_filter($pattern,$replacement,$subject)

1.當$pattern,$replacement都是字符串的時候

<?php 
header("content-type:text/html;charset=utf-8");
$pattern="/[0-9]/";
$subject="weur3ui7";
$replacement="中國";
$str1=preg_replace($pattern,$replacement,$subject);
$str2=preg_filter($pattern,$replacement,$subject);
echo $str1."<br/>";//weur中國ui中國
echo $str2."<br/>";//weur中國ui中國

2.當$pattern,$replacement都是數組的時候

<?php 
header("content-type:text/html;charset=utf-8");
$pattern=array("/[0-3]/","/[3-9]/");
$subject="weur3ui7";
$replacement=array("中","國");
$str1=preg_replace($pattern,$replacement,$subject);
$str2=preg_filter($pattern,$replacement,$subject);
echo $str1."<br/>";//weur中ui國
echo $str2."<br/>";//weur中ui國

3.當$pattern、$replacement、$subject都是數組時。

<?php 
header("content-type:text/html;charset=utf-8");
$pattern=array("/[0-3]/","/[3-9]/");
$subject=array("weur","3ui7");
$replacement=array("中","國");
$str1=preg_replace($pattern,$replacement,$subject);
$str2=preg_filter($pattern,$replacement,$subject);
print_r($str1)."<br/>";//Array ( [0] => weur [1] => 中ui國 )
print_r($str2)."<br/>";//Array ( [1] => 中ui國 )

於是,我們總結:
1.$pattern與$replacement可以都是字符串或都是數組(查找與替換要一一對應

2.$subject可以爲字符串或數組。當時數組是,對$subject的每一個元素都執行查找替換。

3.如果preg_filter()沒有查找到元素,即沒有匹配到,就不會返回結果;
但preg_replace()縱使沒有匹配成功,也會返回原來的字符串。

3.preg_grep()

preg_filter() 返回 匹配到並且替換後的字符串
preg_grep() 返回 匹配到的字符串

兩者共同點:過濾作用(沒被$pattern匹配到的都過濾掉)

<?php 
header("content-type:text/html;charset=utf-8");
$pattern='/[0-9]/';//這裏的$pattern只可以是字符串類型,不可以是數組類型
$subject=array("weur","3ui7");
$str=preg_grep($pattern,$subject);
print_r($str);//Array ( [1] => 3ui7 )

4.preg_split()

preg_split($pattern,$subject)
$subject匹配到符合$pattern的,就做一次分割。返回分割後的字符串組成的數組。

<?php 
header("content-type:text/html;charset=utf-8");
$pattern='/[0-9]/';
$subject="你5好2嗎?";
$str=preg_split($pattern,$subject);
print_r($str);//Array ( [0] => 你 [1] => 好 [2] => 嗎? )

其實,就是一個升級版本的explode()函數

5.preg_quote()

將正則表達式的運算符進行轉義。

<?php 
header("content-type:text/html;charset=utf-8");
$pattern='/[0-9]/';
$str=preg_quote($pattern);
print_r($str);//   /\[0\-9\]/

注意:基本上每個函數都是以$pattern開頭

三.正則表達式基本語法

1.界定符:

標誌着正則表達式的開始和結束

/正則表達式/(/爲界定符)
還有兩種:##{}

不過,還是以 / 最流行。

2.原子

正則表達式所匹配到的最小單位
可見原子:我們鍵盤上所能打出的可見的字符(如a-z 0-9 &)(<>)
不可見原子:存在但看不到的字符(如 \t製表符 \n回車符 空格符)

3.元字符

1.運算符號
| 選擇
[] 匹配[]中的任意一個原子
[^] 匹配除了[]中的任意原子

注意:[^0-9]匹配除了0-9之外的任意內容 ^[0-9]匹配開頭是數字的內容

2.匹配一類原子
. 匹配除換行符之外的任一原子
\d 匹配任意十進制數[0-9]
\D 匹配任意非十進制數[^0-9]
\s 匹配任意非可見原子
\S 匹配任意可見原子
\w 匹配[a-z A-Z 0-9 _]
\W 和\w相反

4.量詞

{m}恰好出現m次
{m,}出現m次以上
{m,n}出現m-n次
* 出現0次、1次或多次
+出現1次及以上
?出現0-1次

比如\d{5}表示連續出現的5個數字

5.邊界控制與模式單元

5.1邊界控制

^ 表示必須以^後面的某個字符開頭
$ 表示必須以$前面的某個字符結尾

5.2模式單元

() 裏面括的整體,算作一個原子。

四.修正模式

所謂修正模式,就好像手機裏的情景模式。修正模式規定了正則表達式以怎樣的方式來匹配。

1.貪婪模式與懶惰模式

貪婪模式是正則表達式默認的模式。(也就是當出現歧義的時候,匹配最多的情況)
懶惰模式要用U來指定。(也就是當出現歧義的時候,匹配最少的情況)

<?php 
header("content-type:text/html;charset=utf-8");
$pattern1='/imooc.+123/';//貪婪模式
$pattern2='/imooc.+123/U';//懶惰模式
$subject="I love imooc__123123123";
preg_match($pattern1,$subject,$arr1);
preg_match($pattern2,$subject,$arr2);
print_r($arr1);//imooc__123123123
print_r($arr2);//imooc__123

2.忽略大小寫

忽略大小寫使用 i 模式

3.忽略空白

忽略空白使用 x 模式
空白包括:空格、換行、製表符。

4.使得點(.)匹配任意字符

使用s模式,可以使點(.)匹配任意字符,包括換行符。

五.常見的正則表達式

1.匹配手機號
/^1(3|4|5|7|8)\d{9}/

2.匹配e-mail地址
^\w+(.\w+)*@\w+.{1}(com|cn|com.cn|org)
可以匹配:
[email protected]
[email protected]

推薦一款正則表達式在線驗證工具,可以實時檢測正則表達式是否書寫正確。
regexpal

regexpal

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章