‘壹’ 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));