【问题标题】:Need help to parse html codes需要帮助来解析 html 代码
【发布时间】:2013-09-11 11:35:37
【问题描述】:

我正在解析 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 函数。

请帮助我,谢谢。

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我相信 Stack Overflow 要求我说一些关于使用正则表达式抓取 HTML 的坏话:

      • 不要将正则表达式用作独立的解析器。
      • 使用正则表达式,如果您只是想在某些文本中查找一些字符串,并且语言的特性并不重要。

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

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

      REY

      • &lt;td.+?class=:这将允许您在&lt;tdclass 之间拥有任何东西。所以如果你有其他属性你会很酷。请注意像+? 这样的惰性量词会降低性能。所以不要这样做一百万次。
      • (?:weekday|weekend): 和你之前的差不多,除了它是一个非捕获组。我使用非捕获组,以便$matches[1] 拥有您要查找的代码。
      • (?:\s+reservation\s+(?:primary|alternate)\s+fixwidth\s+|\s+):这将匹配前两个示例中的字符串,或者仅匹配后两个示例中的空格。我考虑过只做.+?,如果这些类不重要,那就做吧。
      • calday fixwidth.*?":这允许任何其他类。
      • "[^&gt;]*&gt;:这允许更多属性,但它比.*? 性能更好。
      • (.+?)&lt;/td&gt;:模式结束。

      请注意,如果您有嵌套匹配,这将失败,您将需要使用解析器:

      <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

      这使用前瞻来尝试将具有class 属性的td 与交替中的至少三个实例进行匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多