我正在解析HTML代码并被卡住了。我希望有人帮助我。详细代码请点击此链接:http://regexr.com?369sg
我希望得到任何匹配:
<td class="weekday reservation alternate fixwidth calday fixwidth " > ? </td><!--1-->
<td class="weekend reservation alternate fixwidth calday fixwidth " > ? </td><!--2-->
<td class="weekday calday fixwidth"> </td><!--3-->
<td class="weekend calday fixwidth"> </td><!--4-->
如果我使用这种模式:
/<td class="(weekday|weekend) reservation (primary|alternate) fixwidth calday fixwidth " >(.*?)<\/td>/
我只有1号和2号, 如果我使用这种模式:
/<td class="(weekday|weekend) calday fixwidth">(.*?)<\/td>/
我只得到了3,4号。
如何使用一种模式匹配上面的所有数字(1,2,3,4)? 无论如何,我正在使用preg_match_all函数。
请帮帮我,谢谢。
答案 0 :(得分:0)
除了你最好使用一个html解析器,这里有一个正则表达式来完成这项工作:
/<td class="(weekday|weekend) (?:reservation (primary|alternate) fixwidth )?calday fixwidth " >(.*?)<\/td>/
答案 1 :(得分:0)
我相信Stack Overflow要求我说使用正则表达式来刮HTML:
所以这是一个新的正则表达式:
<td.+?class="(?:weekday|weekend)(?:\s+reservation\s+(?:primary|alternate)\s+fixwidth\s+|\s+)calday fixwidth.*?"[^>]*>(.+?)</td>
<td.+?class=
:这样您就可以在<td
和class
之间拥有任何内容。所以,如果你有其他属性,你会很酷。请注意像+?
这样的惰性量词会有性能损失。所以不要这样做一百万次。(?:weekday|weekend)
:与之前完全相同,只是它是非捕获组。我使用非捕获组,以便$matches[1]
拥有您正在寻找的代码。(?:\s+reservation\s+(?:primary|alternate)\s+fixwidth\s+|\s+)
:这将匹配前两个示例中的字符串,或者只匹配最后两个示例中的空格。我考虑过只做.+?
,如果这些类不重要那就做了。calday fixwidth.*?"
:这允许任何其他类。"[^>]*>
:这允许更多属性,但效果比.*?
更好。(.+?)</td>
:模式结束。请注意,如果您有嵌套匹配项,则会失败,而您需要使用解析器:
<td class="weekday calday fixwidth">
<table><tr>
<td class="weekday calday fixwidth"> </td>
</tr></table>
</td>
结果会有一个匹配:
<td class="weekday calday fixwidth">
<table><tr>
<td class="weekday calday fixwidth"> </td>
第1组将是:
<table><tr>
<td class="weekday calday fixwidth">
<强>替代强>
而不是这种特定的模式,我会尝试更灵活的替代方案:
<td.+?class="(?:[^"]*(?:weekday|weekend|primary|alternate|calday|fixwidth)){3,}[^"]*"[^>]*>(.+?)</td>
这使用了一个向前看,尝试匹配具有td
属性的class
,并且在更改中至少有三个实例。