我的正则表达式出了什么问题?
"/Blabla\(2\) :.*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uis"
...
<tr>
<td class="aaa">Blabla(1) :</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) :</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导航器,在我的情况下这是不可能的。
答案 0 :(得分:1)
这是一个有趣的正则表达式,我在其中了解了不合适的旗帜,很好!
对于您的问题,您可以使用\G
在上一次匹配后立即匹配并使用标记g
,假设PCRE引擎:
/(?:Blabla\(2\) :|(?<!^)\G).*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uisg
或者使用不同的分隔符缩短一点:
'~(?:Blabla\(2\) :|(?<!^)\G).*<tr><td class="generic">(.*)</td>.+</tr>~Uisg'
答案 1 :(得分:0)
感谢@Jerry,我今天学到了新的技巧:
(Blabla\(2\) :.*?|\G)<tr><td class=\"generic\">\K([^<]+).+?<\/tr>\r\n