1. 超常用的php正則表達式收集整理
以下就是對超常用的PHP正則表達式進行的收集整理,為了方便大家更快更好的掌握php正則表達式。
一、表單驗證匹配
驗證賬號,字母開頭,允許
5-16
位元組,允許字母數字下劃線:^[a-zA-Z][a-zA-Z0-9_]{4,15}$
驗證賬號,不能為空,不能有空格,只能是英文字母:^\S+[a-z
A-Z]$
驗證賬號,不能有空格,不能非數字:^\d+$
驗證用戶密碼,以字母開頭,長度在
6-18
之間:^[a-zA-Z]\w{5,17}$
驗證是否含有
^%&',;=?$\
等字元:[^%&',;=?$\x22]+
匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配騰訊QQ號:[1-9][0-9]{4,}
匹配日期,只能是
2004-10-22
格式:^\d{4}\-\d{1,2}-\d{1,2}$
匹配國內電話號碼:^\d{3}-\d{8}|\d{4}-\d{7,8}$------------評註:匹配形式如010-12345678
或0571-12345678
或
0831-1234567
匹配中國郵政編碼:^[1-9]\d{5}(?!\d)$
匹配身份證:\d{14}(\d{4}|(\d{3}[xX])|\d{1})------------評註:中國的身份證為15
位或18
位
不能為空且二十位元組以上:^[\s|\S]{20,}$
二、字元匹配
匹配由
26
個英文字母組成的字元串:^[A-Za-z]+$
匹配由
26
個大寫英文字母組成的字元串:^[A-Z]+$
匹配由
26
個小寫英文字母組成的字元串:^[a-z]+$
匹配由數字和
26
個英文字母組成的字元串:^[A-Za-z0-9]+$
匹配由數字、26個英文字母或者下劃線組成的字元串:^\w+$
匹配空行:\n[\s|
]*\r
匹配任何內容:[\s\S]*
匹配中文字元:[\x80-\xff]+
或者
[\xa1-\xff]+
只能輸入漢字:^[\x80-\xff],{0,}$
匹配雙位元組字元(包括漢字在內):[^\x00-\xff]
三、匹配數字
只能輸入數字:^[0-9]*$
只能輸入n位的數字:^\d{n}$
只能輸入至少n位數字:^\d{n,}$
只能輸入m-n位的數字:^\d{m,n}$
匹配正整數:^[1-9]\d*$
匹配負整數:^-[1-9]\d*$
匹配整數:^-?[1-9]\d*$
匹配非負整數(正整數
+
0):^[1-9]\d*|0$
匹配非正整數(負整數
+
0):^-[1-9]\d*|0$
匹配正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
匹配負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
匹配浮點數:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
匹配非負浮點數(正浮點數
+
0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
匹配非正浮點數(負浮點數
+
0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
四、其他
匹配HTML標記的正則表達式(無法匹配嵌套標簽):<(\S*?)[^>]*>.*?</\1>|<.*?
/>
匹配網址
URL
:[a-zA-z]+://[^\s]*
匹配
IP
地址:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
匹配完整域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
提示
上述正則表達式通常都加了
^
與
$
來限定字元的起始和結束,如果需要匹配的內容包括在字元串當中,可能需要考慮去掉
^
和
$
限定符。
以上正則表達式僅供參考,使用時請檢驗後再使用,希望通過這些超常用的PHP正則表達式
2. php如何正則匹配出帶問號的域名來php如何正則匹配出帶問號的域名來源
PHP-如何在PHP中使用正則表達式匹配URL中的域名
馬鞭php//從URL獲取主機名
preg_match(/^(http://)?(【^/])/i,,$matches);
$host=$matches[2];
//從主機名中獲取最後兩段
preg_match(/[^./].[^./]$/,$host,$matches);
回聲;
馬鞭month=$month中的$php_self是鏈接地址,這里給出的是一個變數來代替冗長的字元串,比如說www.phpfans.net,問號後面的year、month傳的參數,並分別給他們賦值為$y-lnk、$month。添加該鏈接出錯是語法錯誤!將雙引號去掉即可。
mysql中?號是什麼?
問號表示稍後將被replace的參數。使用參數化查詢比將參數直接embedded查詢更安全。
SQLServer調用這個參數化查詢,而Oracle調用它綁定variables。
用法因您執行查詢的語言而異。
這里是一個如何使用PHP的例子。
假設$mysqli是一個資料庫連接,而people是一個有4列的表。
3. PHP如何用正則表達式把標准時間年月日轉為橫杠形式
首先,應該是雙反斜杠,不是單反斜杠
這里提供兩種方式
str_replace(array('年','月'),'-',$date_str);
date('Y-m-d H:i',strtotime($date_str));
4. php正則表達式
優先匹配哪個?
通常是優先匹配左邊的(從左往右執行嘛,然後又因為有貪婪性,比如[0-9]*[0-9]*去匹配123,左邊的[0-9]*會匹配到12,右邊的[0-9]*會匹配到3),正則表達式左邊的部分會匹配到能是能使匹配成功的最長的匹配,具體原因如下:
貪婪、回溯和正則導向引正則擎的急切性:正則的{}和*合+有具貪婪性會向後匹配到他們可以匹配的盡可能多的字元串。但是如果重復性的匹配會引起整個(後面的)正則表達式匹配失敗時,會引起回溯,放棄最後一次重復匹配(相當於剩餘的字元串從左邊增加了一位),用表達式後面的部分匹配剩餘的字元串。在前面的正則匹配成功後立即用剩餘的表達式部分繼續匹配後面的內容,如果匹配成功會立刻返回匹配成功,不會繼續回溯(php的正則表達式引擎室正則導向的)
。
裡面的(.*)是怎麼找得?
*有具貪婪性會向後匹配到.可以匹配的最大長度的字元串,最初匹配到-2011-2012,然後因為回溯不斷減少匹配的值,直到匹配-201。
過程是怎樣的,
執行順序:
1.[0-9]{2,4}會先匹配到2010,
2.然後(.*),因為*得貪婪性會匹配到後面所有.能匹配的字元-2011-2012。
3.此時表達式執行到[0-9]{1,2},因為[0-9]{1,2}此時沒有任何可以匹配的內容,所以引起回溯(.*)匹配到前一次匹配結果的倒數第2位重新匹配到-2011-201,[0-9]{1,2}與最後一位匹配成功得到字元串最後面的2,因為正則引擎的急切性,匹配成功後會立即用正則表達式剩餘的部分繼續向後匹配。
4.此時表達式執行到\1,字元串後面沒有剩下任何東西所以\1 (\1指(.*)匹配的結果-2011-201)匹配失敗,然後引起回溯。[0-9]{1,2}向前移一位,結果[0-9]{1,2}沒有字元可以進行匹配操作,匹配失敗。引起回溯,(.*)匹配到前一次匹配結果的倒數第2位重新匹配到-2011-20,再用[0-9]{1,2}匹配得到12,後面依然沒有字元與\1匹配,引起回溯,此次[0-9]{1,2}匹配到1,\1(此時值為-2011-20)與2匹配再次失敗。於是重復上面的回溯【此處省去n百字,總之是重復上面的回溯】,直到(.*)匹配到-201,\1匹配到了-2012中的-201,因為正則導向的正則引擎是急切的,不再進行回溯,繼續後面的匹配。
5.最後,[0-9]{1,2}與字串剩餘部(最後一個字元)2匹配成功返回,因為正則導向的正則引擎是急切的,所以立刻返回匹配結果,不再進行回溯。
睡覺前看到的沒想到寫出來這么難,不過也沒白寫,就當總結了。