A. 怎么用php正则获得a标签内的文字啊
php中正则匹配只要使用这两个函数:
preg_match_all
preg_match
这里使用preg_match_all,代码如下:
$subject='<ahref="xxx.php">abc测试</a>';//假设这是需要匹配的字符串
$pattern='/<ahref="[^"]*"[^>]*>(.*)</a>/';//这是匹配的正则表达式
preg_match_all($pattern,$subject,$matches);//开始匹配,该函数会把匹配结果放入$matches数组中
echo"<pre>";
print_r($matches);
/**
结果是:
Array
(
[0]=>Array
(
[0]=>abc测试
)
[1]=>Array
(
[0]=>abc测试
)
)
*/
B. 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匹配成功返回,因为正则导向的正则引擎是急切的,所以立刻返回匹配结果,不再进行回溯。
睡觉前看到的没想到写出来这么难,不过也没白写,就当总结了。