一.正則表達式基礎
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]