用正则表达式获得最后?

时间:2011-10-05 20:15:26

标签: html regex

我需要在每行的最后</td>和结束</tr>之间获取所有代码。我使用的正则表达式<\/TD\s*>(.*?)<\/TR\s*>从第一个</TD>到最后</TR>检索所有正则表达式 - 在下面的示例中标有粗体。

<TABLE>
 <TR><TD>TD11**</TD><TD>TD12</TD><TD>TD13</TD><SPAN><FONT>test1</FONT></SPAN></TR>**
 <TR><TD>TD21**</TD><TD>TD22</TD><TD>TD23</TD><SPAN><FONT>test2</FONT></SPAN></TR>**
</TABLE>

但我真正需要的是

<TABLE>
 <TR><TD>TD11</TD><TD>TD12</TD><TD>TD13**</TD><SPAN><FONT>test1</FONT></SPAN></TR>**
 <TR><TD>TD21</TD><TD>TD22</TD><TD>TD23**</TD><SPAN><FONT>test2</FONT></SPAN></TR>**
</TABLE>

2 个答案:

答案 0 :(得分:2)

不建议使用正则表达式来解析HTML,html是非常规的,并且在尝试使用正则表达式时非常不可靠。

这是一篇很好的博客文章,解释了逻辑和提供替代方案: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

答案 1 :(得分:1)

</TD>((?:(?!</T[DR]>).)*)</TR>

正则表达式启动以匹配第一个</TD>,但是一旦到达第二个</TD>就会失败,因为(?!</T[DR]>).匹配任何</TD>不是</TR>(?:...)*标记的第一个字符的字符。由于封闭</TR>,这是可选的,因此它会尝试匹配正则表达式的下一部分,即</TD>。这也失败了,所以放弃了比赛尝试。

它再次尝试从第二个</TD>开始并再次失败。最后,它会在第三个​​ </TR>处开始匹配,并从那里成功匹配到第一个{{1}}。

如果您的示例中没有显示换行符,您可能需要指定“单行”或“点匹配全部”模式。你没有指定正则表达式的味道,所以我不能确切地说如何做到这一点。