php使用正則表達式

正則表達式在所有編程語言中都是比較重要的知識,php也提供瞭正則表達式可以通過正則來進行字符串查找和替換,基本上我們可以把java的正則用在php上

一 正則規范

1.常用的正則規范

\w 表示字母、數字、下劃線

\W 表示非字母、數字、下劃線

\d 表示數字

\D 表示非數字

\s 表示所有空白字符(換行、空格等)

\S 表示所有非空白字符

^ 行的開頭(用於定界)

$ 行的結尾(用於定界)

. 匹配除換行之外的任意字符

[abc] 字符a,b,c

[^abc] 除瞭a,b,c之外的任意字符

[a-zA-Z0-9] 表示由字母、數字組成

\n 表示換行

\\ 表示反斜杠

2.數量表示(X表示一組規范)

X? 可以出現0次或1次

X+ 可以出現1次或多次

X* 可以出現0次、1次或多次

X{n} 必須出現n次

X{n,} 必須出現n次以上

X{n,m} 必須出現n至m次

3.邏輯運算符(X、Y表示一組規范)

XY X規范後跟著Y規范

(X) 作為一個捕獲組規范(子表達式)

X|Y X規范或Y規范

二 php中怎樣使用正則

1.使用正則表達式查找固定格式的字符

php提供瞭preg_match()和preg_match_all()兩個方法供我們使用,使用這兩個方法可以做字符串格式校驗和查找

(1) 取出字符串裡的所有四位數

使用之前要註意,php裡規定我們把正則規范寫在P的位置上 ‘/P/i’,先就取四位數這個舉例,代碼如下

echo "

取出字符串裡的所有四位數

"; $str1="abcd1034yu3029"; preg_match_all('/\d{4}/i', $str1,$arr1); foreach ($arr1[0] as $val){ echo "$val"."
"; }

要說明的是$arr1,這個是一個二維數組,php把匹配上的所有的字符放在這個數組裡

(2)取出類似1111、3333這種格式的字符串

這種情況就要使用字表達式瞭,代碼如下

echo "

取出字符串裡的4位數要求每位數字都相同,例如1111、4444、5555、6666

"; $str2="abcd1034yu3029sd3333"; preg_match_all('/(\d)\1{3}/i', $str2,$arr2); foreach ($arr2[0] as $val){ echo "$val"."
"; }

下面是兩段代碼的運行效果

(3)取出類似1111-2222-3333這種格式的字符串

echo "

取出類似1111-2222-3333這種格式的字符串

"; $str3="ab3333-5555-6666cd1034yu3029sd3333"; preg_match_all('/(\d)\1{3}-(\d)\2{3}-(\d)\3{3}/i', $str3,$arr3); foreach ($arr3[0] as $val){ echo "$val"."
"; }

有興趣可以使用print_r()打印下這個$arr3,裡面有2個數組,第一個是匹配出來的字符串,第二個是字表達式的值

(4)來一個稍微復雜點的,取出類似1111-232-3333、1111-575-3333這種格式的字符串的最後4個數字

echo "

取出類似1111-232-3333、1111-575-3333這種格式的字符串的最後4個數字

"; $str4="ab3333-575-6666cd10348888-464-9999"; preg_match_all('/(\d)\1{3}-(\d)\d\2-(\d)\3{3}/i', $str4,$arr4); foreach ($arr4[0] as $val){ $nums=explode("-", $val); echo "$nums[2]"."
"; }

(5)過濾重復字符vcD4KPHA+PHByZSBjbGFzcz0=”brush:java;”>echo “

過濾重復的字符

“;
$repeatstr=”我愛愛和和平”;
preg_match_all(‘/(\w)\1*/iu’, $repeatstr,$arr);
$finalStr=””;
foreach ($arr[1] as $val){
$finalStr.=$val;
}
/i後面的u表示一種規范,表示匹配UTF-8的字符,還有其他幾種大傢可以查看php開發文檔

2.還有一種比較復雜的匹配叫環視匹配

表達式

說明

(?<=Expression)

逆序肯定環視,表示所在位置左側能夠匹配Expression

(?<!Expression)

逆序否定環視,表示所在位置左側不能匹配Expression

(?=Expression)

順序肯定環視,表示所在位置右側能夠匹配Expression

(?!Expression)

順序否定環視,表示所在位置右側不能匹配Expression

這個部分理解起來有點復雜,可以參考下下面這篇文章,裡面有個剝取

中間內容的例子講的還不錯

https://blog.csdn.net/lxcnn/article/details/4304754

下面把我寫的這一整個php頁面貼出來

<?php
echo "

過濾重復的字符

"; $repeatstr="我愛愛和和平"; preg_match_all('/(\w)\1*/iu', $repeatstr,$arr); $finalStr=""; foreach ($arr[1] as $val){ $finalStr.=$val; } echo $finalStr; echo "

取出字符串裡的所有四位數

"; $str1="abcd1034yu3029"; preg_match_all('/\d{4}/i', $str1,$arr1); foreach ($arr1[0] as $val){ echo "$val"."
"; } echo "

取出字符串裡的4位數要求每位數字都相同,例如1111、4444、5555、6666

"; $str2="abcd1034yu3029sd3333"; preg_match_all('/(\d)\1{3}/i', $str2,$arr2); foreach ($arr2[0] as $val){ echo "$val"."
"; } echo "

取出類似1111-2222-3333這種格式的字符串

"; $str3="ab3333-5555-6666cd1034yu3029sd3333"; preg_match_all('/(\d)\1{3}-(\d)\2{3}-(\d)\3{3}/i', $str3,$arr3); foreach ($arr3[0] as $val){ echo "$val"."
"; } echo "

取出類似1111-232-3333、1111-575-3333這種格式的字符串的最後4個數字

"; $str4="ab3333-575-6666cd10348888-464-9999"; preg_match_all('/(\d)\1{3}-(\d)\d\2-(\d)\3{3}/i', $str4,$arr4); foreach ($arr4[0] as $val){ $nums=explode("-", $val); echo "$nums[2]"."
"; } echo "

驗證是否是電子郵件

"; $email="chen@163.com"; preg_match_all('/^\w+@\w+\.\w+$/i', $email,$earr); if(count($earr[0])>0){ echo "$email"."是合法的電子郵件"; }else{ echo "$email"."是非法的電子郵件"; } ?>

You May Also Like