为什么这个只有两个匹配的,$match里都是什么呢????
按照我的意思理解,是要匹配 一个字母(或数字下划线)后面连续跟四个字母数字或下划线的字符,不应该是两个啊,而且$match数组里的东西实在是看不明白。忘牛人解答!
echo preg_match_all( '/(\w)((?=\1\1\1)(\1))+/' , 'aaa ffffff 999999999',$match );
print_r( $match);
按照我的意思理解,是要匹配 一个字母(或数字下划线)后面连续跟四个字母数字或下划线的字符,不应该是两个啊,而且$match数组里的东西实在是看不明白。忘牛人解答!
echo preg_match_all( '/(\w)((?=\1\1\1)(\1))+/' , 'aaa ffffff 999999999',$match );
print_r( $match);
(?=pattern)表示正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。放在一起更加的不理解,期待高手.
2Array ( [0] => Array ( [0] => ffff [1] => 9999999 ) [1] => Array ( [0] => f [1] => 9 ) [2] => Array ( [0] => f [1] => 9 ) [3] => Array ( [0] => f [1] => 9 ) ) “\1”表示和第一个括号中的表达式一样
可是为什么只有两个匹配的呢,光ffffff中就应该有前两个匹配的,999999999中应该有前五个匹配。
print_r( $match);\1表示的是与\w一模一样的字符
所以$match[0]里包含[0] => Array ( [0] => ffff [1] => 9999999
9 99999999
红色表示(\w),蓝色表示(?=\1\1\1)(\1)
由于你对(?=\1\1\1)(\1)使用了贪婪式匹配,所以这里第一次只匹配了ffff和9 999999得到了这样的字符
999999999应该可以有五种匹配。
由于你使用了贪婪式匹配
所以只匹配了2次第一次是匹配ffff,第二次匹配9999999如果如果不使用贪婪式匹配,那么他匹配的就是第一次是匹配ff第二次匹配ff,第三次匹配99,第四次匹配99,第五次匹配99“ffffff 应该可以有两个匹配的,前五个f和后五个f”
不可能有你的这说法的
就可以匹配到5个以上连续的字符串了为什么非要写那么复杂呢?
是这样么?(?=\1\1\1)是零宽的,不匹配任何字符。(\1)只匹配单个字符。这个正则是这样的:首先,(\w)捕获一个字符,并且设置了\1然后后面的(\1)第一次匹配到了第五个f,再次强调(?=\1\1\1)是零宽的
也就是说第二个第三个第四个f是不会被匹配到的。
还有两个问题:
1.贪婪匹配的情况下只能匹配两个,我理解了,可是我又发现一个问题,为什么$match[0][0]中是ffff,应该是fffff才对啊,(\w)((?=\1\1\1)(\1))+
"\w"一个 (?=\1\1\1)三个(\1)一个,为什么最后匹配成了四个呢。2.还有当我把加号去掉了是5个匹配的,“ffffff 应该可以有两个匹配的,前五个f和后五个f”,“chinmo”说不可能有这种情况,那在非贪婪模式下为什么ffffff会被匹配两次呢。
不过“ffffff 应该可以有两个匹配的,前五个f和后五个f”,如果真是这样,
$str = "aaa<vvvB<>cccc</B>ddd<U>eeee</U>ffff";
echo preg_match_all('/<(.+?)>/' , $str , $match); print_r($match);
vvvB<中的<应该也被用于匹配,可是事实上没有,他被当作普通字符了,输出的是:
4Array
(
[0] => Array
(
[0] => <vvvB<>
[1] => </B>
[2] => <U>
[3] => </U>
)
[1] => Array
(
[0] => vvvB<
[1] => /B
[2] => U
[3] => /U
)
)
我彻底糊涂了。