『壹』 php甯哥敤姝e垯琛ㄨ揪寮忔眹鎬
1銆乗w灝辨槸鍖歸厤瀛楁瘝鎴栨暟瀛楁垨涓嬪垝綰挎垨奼夊瓧錛+鍒欎笌*宸涓嶅氾紝鍖哄埆鏄+鍖呮嫭閲嶅0嬈★紝鑰*灝卞彲浠ャ=灝眜shi鍖歸厤=鍙蜂袱涓鏂滄潬鍒欒〃紺烘e垯琛ㄨ揪寮忕殑鍒嗙晫銆
2銆佹e垯琛ㄨ揪寮忕殑闄愬畾絎︽湁錛歍hinkPHP鐨勮嚜鍔ㄩ獙璇佹満鍒舵槸涓轟簡榪涜岃〃鍗曟暟鎹楠岃瘉錛岄獙璇佸彲浠ユ敮鎸乫unction銆乧allback銆乧onfirm銆乪qual銆乽nique鍜宺egex錛岃繖閲岃佽茬殑鏄浣跨敤姝e垯琛ㄨ揪寮忚繘琛岄獙璇併傜壒孌婂瓧絎﹁稿氬厓瀛楃﹁佹眰鍦ㄨ瘯鍥懼尮閰嶅畠浠鏃剁壒鍒瀵瑰緟銆
3銆乛/錛焄a-zA-Z0-9=錛歖*$錛乗鏄瀵筽hp涓鍗曞紩鍙風殑杞涔夈傛垨鑰呰繕鏈夋洿綆鍗曠殑錛乛/錛焄a-z0-9=錛歖*$錛乮i琛ㄧず蹇界暐澶у皬鍐欍傛ā寮忓垎闅旂﹀氨鏄涓轟簡鍖哄垎琛ㄨ揪寮忓拰鍍廼榪欐牱鐨勬ā寮忎慨楗扮﹁岃捐$殑銆
『貳』 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匹配成功返回,因為正則導向的正則引擎是急切的,所以立刻返回匹配結果,不再進行回溯。
睡覺前看到的沒想到寫出來這么難,不過也沒白寫,就當總結了。
『叄』 PHP正則提取6位數字
正則表達式 |(d+)
完整的正則提取6位數字的PHP程序如下
<?php
$str="|175219";
$regex="/|(d+)/";
preg_match_all($regex,$str,$result);
print_r($result[1]);
?>
『肆』 求一個PHP正則表達式匹配(字母、數字、漢字、下劃線)
<?php
$pat='#^([a-zA-Z]+|[0-9]+|[x{4e00}-x{9fa5}]+)$#u';
$s="你好";
var_mp(preg_match($pat,$s));