日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php正则表达式实例详解,正则表达式实例解析

發布時間:2025/3/19 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php正则表达式实例详解,正则表达式实例解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正則表達式實例解析

類別: 技術

時間:2016-06-02 10:14:14

字數:6253

版權所有,未經允許,請勿轉載,謝謝合作~

### 前言

正則表達式(regular expression)幾乎在所有主流計算機語言中都有涉及,初學者很多時候都是從某些地方copy過來,如果不了解它,那也不知道copy的東西對不對。

它并不是一門語言,而是對字符串操作的一種邏輯公式,常常用regex表示。有趣的是,正則表達式并非計算機首創,而是源于數學科學家Stephen Kleene的《神經網事件的表示法》論文中, 再被引入Unix工具軟件,自此廣泛被利用,驗證了理論先于實踐。雖然不同的語言上會有一些流派的小差異,思想卻是相同,為了方便表述,本處多以JavaScript為例。

正則就像翻譯一樣,同樣的意思,有不同的翻譯法,不同的高度。

PS:講個小故事,有人以為只要英語足夠牛逼,就可以成為牛逼的翻譯官,too young too simple。電影《降臨》七肢桶提供表意“武器”,這個可以翻譯成知識,也可以成兵器,差別極大。比起外語能力,更重要的是知識深度與良知正義,所以翻譯官就像語言學家一樣,永無止境的東西。

正則表達式無非是實現兩個功能,搜索與替換。博客內容來自[西法](http://www.boatsky.com "太空船博客" rel="nofollow")之前寫的靜態頁,附帶表達式工具:https://www.boatsky.com/static/tools/regexp/regexp.html

### 常用語法

^字符串開始位置

$字符串結束位置

\轉義字符

\d數字

\D非數字

\w任何單詞字符,包括字母數字下劃線

\W非單詞字符

\s不可見字符

\S可見字符

+匹配表達式1次以上

星號,匹配表達式任意次,盡量使用*?這種非貪婪的模式

?匹配表達式1次或0次

{n}匹配表達式n次,n非負

{n,m}匹配表達式n次至m次,n<=m

[abcde]匹配字符集任意一個,等價于[a-e]

[^0-9]匹配不在本字符集任意一個,等價于\D

(x|y|z)匹配字符集任意一個,等價于[xyz]

\b 單詞邊界

\B 非單詞邊界

以下為非獲取匹配子表達式

(?:pattern) 匹配pattern但不獲取匹配結果,不進行存儲供以后使用

(?=pattern) 正向肯定預查

(?!pattern) 正向否定預查

(?<=pattern) 反向肯定預查

(?

### 簡單實例

#### QQ號

分析:QQ號是純數字,4位至10位,不過也有把11位手機號當QQ的情況

正則:

```

/^[1-9]\d{3,10}$/

```

#### 手機號碼

分析:

移動號19:134,135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188

聯通號09:130,131,132,155,156,185,186,145,170,171,176

電信號06:133,153,177,180,181,189

綜合:

130,131,132,133,134,135,136,137,138,139

145,147

150,151,152,153,155,156,157,158,159

170,171,176,177,178

180,181,182,183,184,185,186,187,188,189

正則:

```

/^(13|14|15|17|18)[0-9]{9}$/

```

#### 數字

js中,如果想驗證整數n,可以直接用Number.isInteger(n)。

如果要驗證n是否是數字,我們一般是使用:

Object.prototype.toString.call(n) === '[object Number]'

這存在幾個明顯的問題:

其一:如果n是一個數字,傳輸中是以String來傳的,這時有問題

其二:如果n為NaN,也認為是數字,這可能不是我們想要的

其三:JS數字范圍有限,如果超過了JS數字的范圍1.797693134862316e+308,n變成了Infinity,這時上式也成立,我們并不想認為Infinity是數字。

其四:我們可能只想要一個驗證長是不是數字,比如有個極大的數,超出了JS數的范圍,不應該認為這個極大的數就不是數,只是原生JS不支持而已。

為了解決這些問題,用正則匹配。

我們把數分成整數、小數、指數,其中整數部分與指數數字是帶正負的

整數 [\+\-]?\d*

小數部分 \.\d+

指數 e[\+\-]?\d*

最終

```

/^[\+\-]?\d*(\.\d+)?(e[\+\-]?\d*)?$/

```

#### 郵箱

分析:郵箱的格式一直是一個有爭議的問題,最常見的格式如xx@xx.xx,不過像xx.oo@xx.com.cn,xx_xx-xx+xx.xx@xx-xx.xx也能見到。

不過多數郵箱還是會在做出類似以下的限定:

1.郵箱只能包含字母數字.-_+與一個@,@之前必須有字母或數字,@之后必須要"2級域名"."1級域名"

2.開頭必須是字母或數字,不能有連續的.-_

3.一級域名一般是只包含字母

正則:

```

/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.[a-zA-Z]+$/

```

#### 網址

分析:網址正則幾乎隨處可見,前綴是傳輸協議,如http,https,ftp,sftp,rtsp(實時流傳輸協議),mms(串流媒體傳送協議),magnet(BT種子)等等,接著則是三級域名(有可能省略),二級域名,一級域名,當然也可能只是IP址,最后詳細路徑

本處,以本網為例

正則:

```

/^http(s?):\/\/((\w)+\.)?boatsky\.com(\.cn)?(\/|$)/i

```

#### 日期時間

分析:日期時間格式 多樣,為了便于表示,以傳統日期年月日時分秒,格式xxxx/xx/xx xx:xx:xx為例,其中年份為4位數,所有位數不足都須補0

首先,我要要驗證這個輸入是否像一個日期,并不考慮這個日期是否存在

日期+時間格式正則:

```

/^\d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])(\x20)(2[0-3]|[0-1][0-9]):([0-5]\d):[0-5]\d$/

```

分析:如果加上1,3,5,7,8,10,12月有31天,4,6,9,11有30天,2月有28天(假設都是平年)

平年月份的正則:

```

/02\/(0[1-9]|1[0-9]|2[0-8])|(0[469]|11)\/(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])\/(0[1-9]|[12][0-9]|3[01])/

```

所以平年的正則:

```

/^\d{4}\/((02\/(0[1-9]|1[0-9]|2[0-8])|(0[469]|11)\/(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])\/(0[1-9]|[12][0-9]|3[01])))(\x20)(2[0-3]|[0-1][0-9]):([0-5]\d):[0-5]\d$/

```

再加上閏年(能被4整除,若能被100整除則需要再被400整除,就是所謂的“4年一閏,100年不閏,400年再閏”),閏年2月29天,平年2月28天

閏年2月有29天也就是兩種情況:

1.能被4整除且不能被100整除。什么樣的數能被4整除?因為100能被4整除,所以只要保證后兩位數能被4整除就行了,即“個位為048,十位為偶數”或“個位為26,十位為奇數”,加上個位與十位不能同時為0,如下:

```

/\d{2}([2468][048]|[13579][26]|0[48])/

```

2.能被400整除。千位與百位需要被4整除,(沒有公元0年,只有公元前1年與公元1年)

```

/([2468][048]|[13579][26]|0[48])00/

```

所以閏年的正則:

```

/\d{2}([2468][048]|[13579][26]|0[48])|([2468][048]|[13579][26]|0[48])00/

```

綜上,最終結果:

```

/^((\d{4}\/((02\/(0[1-9]|1[0-9]|2[0-8])|(0[469]|11)\/(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])\/(0[1-9]|[12][0-9]|3[01]))))|((\d{2}([2468][048]|[13579][26]|0[48])|([2468][048]|[13579][26]|0[48])00)\/(02\/(0[1-9]|1[0-9]|2[0-9])|(0[469]|11)\/(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])\/(0[1-9]|[12][0-9]|3[01]))))(\x20)(2[0-3]|[0-1][0-9]):([0-5]\d):[0-5]\d$/

```

#### 密碼復雜度

分析:現在很多網站都流行對用戶的密碼進行安全等級評定,提醒用戶設置更復雜的密碼,更大可能的保護賬戶安全。

其實所謂的復雜度,無非就是用多個正則進行配置,匹配上越多的正則,則復雜度越高

本處對密碼設以下規則,長度8-32,建議包括大寫字母,建議包括小寫字母,建議包括數字,建議包括特殊字符,不建議包括三個連續字符,

### JavaScript中簡單使用

在JS中,正則表達式用RegExp對象表示,可以用RegExp(pattern,attributes)構造函數來創建RegExp對象,其第一個參數pattern是上述的正則表示式,第二個參數是修飾符,g(全局匹配),i(不區分大小寫匹配),m(多行匹配)

```javascript

var regExp = new RegExp("/^(13|14|15|17|18)[0-9]{9}$/");

```

也可以特殊的直接量語法創建:

```javascript

var regExp = /^(13|14|15|17|18)[0-9]{9}$/;

```

RegExp包括以下方法:

complie:編譯正則,增快速度

test:檢索字符串指定值

```javascript

var regExp = new RegExp(/^(13|14|15|17|18)[0-9]{9}$/);

var result = regExp.test("18812345678"); //返回true或false,這里是true

```

exec:檢索字符串指定值,并確定位置,如果搜索修飾符不是g,那么返回值第0個是匹配上的字符串還包括index(匹配文本第一個的位置)與input(當前被匹配的字符串)兩個屬性

```javascript

var regExp = new RegExp(regExpValuePattern);

var checkResult = regExp.exec(checkContentValue);

if(checkResult){

printResult = "位置:" + checkResult.index + ",字符:" + checkResult[0];

}

var regExp = new RegExp(/a/,g);

var result;

while((result == regExp.exec("abcdefabdaafg"))){

console.log(result);

console.log(regExp.lastIndex);

}

```

String對象有search,match,replace,split是支持正則表達式的

比如用replace把一個正整數轉成千位用,分隔

```javascript

function numberFormat(num) {

if(!(Object.prototype.toString.call(1) === '[object Number]' && Math.floor(num) === num)){

return num;

}

let reg=/\d{1,3}(?=(\d{3})+$)/g;

return (num + '').replace(reg, '$&,');

}

```

### PHP中簡單使用

如果懶的裝PHP,則可以使用在線的PHP編譯方式:

preg_match("$regex",$byMatchStr),其中$regex為正則表達式,$byMatchStr為被匹配的字符串,成功返回true,否則false:

```php

if(preg_match("/php/", "php is best language of the world. php is not pai huang pian.", $matches)){

echo "php was found:". $matches[0];

} else {

echo "php was not found:";

}

```

preg_match_all("$regex",$byMatchStr),其中$regex為正則表達式,$byMatchStr為被匹配的字符串,成功返回true,否則false:

```php

if(preg_match_all("/php/", "php is best language of the world. php is not pai huang pian.", $matches)){

echo "php was found:"

var_dump($matches); } else {

echo "php was not found:";

}

```

preg_replace("$regex",$str,$byMatchStr),其中$str把$byMatchStr替換掉的字符串:

```php

$byMatchStr = "php is best language of the world.";

echo $byMatchStr;

echo "\n";

echo preg_replace("/php/","JavaScript",$byMatchStr);

echo "\n";

echo $byMatchStr;

```

preg_split("$regex",$byMatchStr),使用正則轉換數組:

```php

$byMatchStr = "php is best language of the world.";

$array = preg_split("/ /",$byMatchStr);

foreach($array as $a){

echo $a."\n";

}

```

preg_grep("$regex",$byMatchArray),使用正則替換數組,生成新數組:

```php

$byMatchArray = array("a","b","c","ab","ba","bc");

$newArray = preg_grep("/b$/",$byMatchArray);

var_dump($newArray);

```

全部留言

我要留言

內容:

網名:

郵箱:

個人網站:

發表

總結

以上是生活随笔為你收集整理的php正则表达式实例详解,正则表达式实例解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。