具有多个结果的正则表达式

时间:2013-10-02 17:07:12

标签: regex html-parsing

我的正则表达式出了什么问题?

"/Blabla\(2\)&nbsp;:.*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uis"

...

<tr>
<td class="aaa">Blabla(1)&nbsp;:</td>
<td>
<table class="bbb"><tbody>
<tr class="ccc"><th>title1</th><th>title2</th><th>title3</th></tr>
<tr><td class="generic">word1</td><td class="generic">word2 </td><td class="generic">word3</td></tr>
<tr><td class="generic">word4</td><td class="generic">word5 </td><td class="generic">word6</td></tr>
</tbody></table>
</td>
</tr>

<tr>
<td class="aaa">Blabla(2)&nbsp;:</td>
<td>
<table class="bbb"><tbody>
<tr class="ccc"><th>title1</th><th>title2</th><th>title3</th></tr>
<tr><td class="generic">word1b</td><td class="generic">word2b </td><td class="generic">word3b</td></tr>
<tr><td class="generic">word4b</td><td class="generic">word5b </td><td class="generic">word6b</td></tr>
</tbody></table>
</td>
</tr

我想要做的是从Blabla(2)开始的块中获取每个TR的FIRST TD的内容。

所以预期的答案是word1b和word4b 但只返回第一个......

感谢您的帮助。请不要回答我使用DOM导航器,在我的情况下这是不可能的。

2 个答案:

答案 0 :(得分:1)

这是一个有趣的正则表达式,我在其中了解了不合适的旗帜,很好!

对于您的问题,您可以使用\G在上一次匹配后立即匹配并使用标记g,假设PCRE引擎:

/(?:Blabla\(2\)&nbsp;:|(?<!^)\G).*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uisg

regex101 demo

或者使用不同的分隔符缩短一点:

'~(?:Blabla\(2\)&nbsp;:|(?<!^)\G).*<tr><td class="generic">(.*)</td>.+</tr>~Uisg'

答案 1 :(得分:0)

感谢@Jerry,我今天学到了新的技巧:

(Blabla\(2\)&nbsp;:.*?|\G)<tr><td class=\"generic\">\K([^<]+).+?<\/tr>\r\n