一段小正则疑问,求解

hphper 发布于 2014/07/24 13:53
阅读 198
收藏 0

下面是我 基于我遇到的正则问题 弄出来的便于在这里问的问题模型

<?php
$str=<<<E
<tr>															
	<tr><td id="data">A</td></tr>
	<td head="data">a</td>
	<td head="data">b</td>
</tr>
//----------第一部分分割符------------
<tr>															
	<tr><td id="data">B</td></tr>
	<td head="data">a1</td>
	<td head="data">b2</td>
</tr>
<tr>
<td head="data">a2</td>
<td head="data">b2</td>
</tr>
<tr>
<td head="data">a3</td>
<td head="data">b3</td>
</tr>
<tr>
<td head="data">a4</td>
<td head="data">b4</td>
</tr>
//------------第二部分分割--------
<tr>															
	<tr><td id="data">C</td></tr>
	<td head="data">a5</td>
	<td head="data">b5</td>
</tr>
<tr>
<td head="data">a6</td>
<td head="data">b6</td>
</tr>
<tr>
<td head="data">a7</td>
<td head="data">b7</td>
</tr>
E;
$p='#
<tr>\s*
<tr>\s*
<td \s* id="data">([^<>]*)</td>\s*
</tr>\s*
<td [^<>]*>([^<>]*)</td>\s*
<td [^<>]*>([^<>]*)</td>\s*
</tr>\s*
(?:<tr>\s*
<td [^<>]*>([^<>]*)</td>\s*
<td [^<>]*>([^<>]*)</td>\s*
</tr>\s*){0,}#xs';
preg_match_all($p, $str, $re);
print_r($re);
 

一共匹配到三组符合的内容(第一部分,第二部分,第三部分)

在第一部分没有第4个子匹配 ,所以为空 即$re[4][0]为空 没错

在匹配第二部分时为什么不是a2二是a4呢($re[4][1]为何不是a2而是a4)
还有这三组的第5个子匹配
在匹配第二部分内容时
$re[5][1]为何不是b2而是b4
匹配第三部分内容时
$re[5][2]为何不是b6而是b7
------------------------
如果我想得到
Aa
Ab
Ba1
Bb2
Ba2
Bb2
Ba3
Bb3
Ba4
Bb4
Ca5
Cb5
Ca6
Cb6
Ca7
Cb7

该怎么一次性匹配出呢(用一次正则就Ok,然后在结果中组合即可)
我现在是先匹配出三部分内容
然后在分别在三部分内容里再次匹配 组合,虽然也能得到,但有更好的办法吗?
加载中
0
freesnow
freesnow
回答你第一个问题吧,举个例子就是,对于字符串“abcdefgh”,用(?:.(.))+来匹配,捕获分组只会是h
freesnow
freesnow
回复 @hphper : 应该是没有
hphper
hphper
回复 @freesnow : 我就是这样匹配处理的,不知道有更好的解决方案没?
freesnow
freesnow
回复 @hphper : 加了{0,}这种量词以后,不可能获得{0,}前的元素每一次匹配的字符串。所以你可能需要先分别匹配你的这三个部分,然后再用没有{0,}的正则去全部匹配。说的可能比较模糊,不知道你明白我的意思吗?
hphper
hphper
回复 @freesnow : 不加{0,}我只能匹配到一部分啊,其它部分怎么办
freesnow
freesnow
回复 @hphper : 你是问为什么不是保存第一个而是最后一个,还是问为什么不把全部都保存下来?如果是前者,那你不要加{0,},那就得到第一个了,如果是后者,那我问你,全部保存下来的话,你怎么分别获取每一个值?至于为什么只保存了最后一个,我感觉这不难理解吧,正则是一直向前(也就是从字符串开头到结尾)匹配的,当然保存最后一次匹配到的值,之前保存的值都被覆盖了(应该可以这么认为)。
下一页
0
hphper
hphper
没人吗
0
hphper
hphper
还是没人啊
0
hphper
hphper
还是没人
0
卖红薯
卖红薯
你这用一条正则取不出来的。我一般先分割,再获取数据。
hphper
hphper
怎样能一次全取出呢?
返回顶部
顶部