需要帮助来解析HTML代码

时间:2013-09-11 11:35:38

标签: php regex preg-match-all

我正在解析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">&nbsp;</td><!--3-->
<td class="weekend calday fixwidth">&nbsp;</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函数。

请帮帮我,谢谢。

2 个答案:

答案 0 :(得分:0)

除了你最好使用一个html解析器,这里有一个正则表达式来完成这项工作:

/<td class="(weekday|weekend) (?:reservation (primary|alternate) fixwidth )?calday fixwidth " >(.*?)<\/td>/

答案 1 :(得分:0)

我相信Stack Overflow要求我说使用正则表达式来刮HTML:

  • 不要使用正则表达式作为独立的解析器。
  • DO 使用正则表达式,如果您只是想找到一些字符串,而某些文字和语言的功能无关紧要。

所以这是一个新的正则表达式:

<td.+?class="(?:weekday|weekend)(?:\s+reservation\s+(?:primary|alternate)\s+fixwidth\s+|\s+)calday fixwidth.*?"[^>]*>(.+?)</td>

REY

  • <td.+?class=:这样您就可以在<tdclass之间拥有任何内容。所以,如果你有其他属性,你会很酷。请注意像+?这样的惰性量词会有性能损失。所以不要这样做一百万次。
  • (?: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">&nbsp;</td>
   </tr></table>
</td>

结果会有一个匹配:

    <td class="weekday calday fixwidth">
   <table><tr>
      <td class="weekday calday fixwidth">&nbsp;</td>

第1组将是:

  <table><tr>
      <td class="weekday calday fixwidth">&nbsp;

<强>替代

而不是这种特定的模式,我会尝试更灵活的替代方案:

<td.+?class="(?:[^"]*(?:weekday|weekend|primary|alternate|calday|fixwidth)){3,}[^"]*"[^>]*>(.+?)</td>

REY

这使用了一个向前看,尝试匹配具有td属性的class,并且在更改中至少有三个实例。