php - preg_match
任务:匹配一个函数名或者变量名,如果碰到alpha,numeric,_以外的全部不允许通过。
实验1:
<?php //第一个字符不符合就直接退出正则匹配 $str = '%abcscript%d'; var_dump(preg_match('/^(\w*)$/', $str, $matches)); var_dump($matches); #########output######## #int(0) #array(0) { #} ####################### #匹配到 $str1 = 'abcscriptd123_'; var_dump(preg_match('/^(\w*?)$/', $str1, $matches)); var_dump($matches); #########output######## #int(1) #array(2) { # [0]=> # string(14) "abcscriptd123_" # [1]=> # string(14) "abcscriptd123_" #} ####################### #中间有不匹配模式的 $str2 = 'acd%acd'; var_dump(preg_match('/^(\w*?)/', $str2, $matches)); var_dump($matches); #########output######## #int(1) #array(2) { # [0]=> # string(0) "" # [1]=> # string(0) "" #} ##################### //检查一个字符串里面仅包含字母数字或者下划线
第一个的结果显而易见,preg_match返回0,第二个的结果如预期是全串都符合并匹配到,第三个的结果有些出人意料,那为什么preg_match返回1,而$matches未如预期一样包含匹配到的acd呢?
再做一个实验,实验2
<?php #中间有不匹配模式的 $str2 = 'acd%acd'; var_dump(preg_match('/^(\w*)/', $str2, $matches)); var_dump($matches); #########output######## #int(1) #array(2) { # [0]=> # string(3) "acd" # [1]=> # string(3) "acd" #} #####################
实验2的结果:这次可以匹配到符合条件的部分子串 "acd" 了。
对比结果表明:?这个贪婪匹配符起到了很重要的作用,但是对其的工作原理仍然不甚明了。需要继续深入理解。
那么如何完成任务?要检查一个字符串是否只包含alpha, numeric, _
结论是: preg_match('/(\w*)/', $str, $matches);
检查$matches[1] == $str,如果为true则表示该字符串满足条件,为false则表示该字符串不满足条件
<?php $str = 'acd123_'; var_dump(check_word($str)); $str = 'acd%123_'; var_dump(check_word($str)); $str = '%acd123_'; var_dump(check_word($str)); function check_word($str) { preg_match('/^(\w*)/', $str, $matches); if($matches[1] == $str){ return true; } else { return false; } }
输出:
bool(true) bool(false) bool(false)
任务:把ubb中img标签的内容找出来[img]100.png[/img]
目标:熟悉正则表达式中()的用法
代码:
<?php $str = '[img]100[/img]test.png[img]1000[/img]'; preg_match_all('/\[img\](.*?)\[\/img\]/', $str, $matches); var_dump($matches);
输出:
array(2) { [0]=> array(2) { [0]=> string(14) "[img]100[/img]" [1]=> string(15) "[img]1000[/img]" } [1]=> array(2) { [0]=> string(3) "100" [1]=> string(4) "1000" } }
任务:把[img]100[/img]提取出来,满足两个要求:能够提取100,并且能够提取出[img]100[/img]这样的模式
目标:熟悉正则表达式中()的用法
代码:
<?php $str = '[img]100[/img]test.png[img]1000[/img]'; preg_match_all('/(\[img\](.*?)\[\/img\])/', $str, $matches); var_dump($matches);
输出:
array(3) { [0]=> array(2) { [0]=> string(14) "[img]100[/img]" [1]=> string(15) "[img]1000[/img]" } [1]=> array(2) { [0]=> string(14) "[img]100[/img]" [1]=> string(15) "[img]1000[/img]" } [2]=> array(2) { [0]=> string(3) "100" [1]=> string(4) "1000" } }
理解:正则表达式的括号()能提取字符串中的那些匹配的串,0号match是整个模式的匹配串,1号match是从左往右的第一个()括号中匹配的内容,2号match是第二个()括号中匹配的内容,以此类推。
关于preg_match_all, 可见另一篇文章:http://www.cnblogs.com/helww/p/3248345.html
keyword: preg_match preg_match_all