【问题标题】:Regular Expression Not Working正则表达式不起作用
【发布时间】:2011-02-10 11:46:18
【问题描述】:

大家好

我有这个正则表达式如下:

$thread_views_exp = '~<td class="alt1" align="center">.*</td> <td class="alt2" align="center">(.*)</td> </tr>~isU';

这样做的目的是获取此示例线程 url http://www.swalif.net/softs/swalif45 的所有“视图”(左起第一列)。除了第一个值外,一切正常。

样本输出:

Array
(
    [0] => 12 528
    [1] => 2,732
    [2] => 506
    [3] => 73
    [4] => 83
    [5] => 245
    [6] => 100
    [7] => 201
    [8] => 55
    [9] => 55
    [10] => 37
    [11] => 349
    [12] => 123
    [13] => 75
    [14] => 173
    [15] => 260
    [16] => 101
    [17] => 660
    [18] => 158
    [19] => 66
    [20] => 177
    [21] => 165
    [22] => 228
    [23] => 812
    [24] => 347
    [25] => 197
    [26] => 348
    [27] => 263
    [28] => 176
    [29] => 315
    [30] => 173
    [31] => 273
    [32] => 199
)

感谢您的帮助。 伊姆兰

【问题讨论】:

  • 不要parse html with regex。所以不要尝试...
  • 请不要把你的想法塞给别人。让每个人都有自己的看法。我在我的上下文中使用它,并且我 90% 的工作都非常成功。这只是一件小事,如果你能帮助它的alrite,那就卡住了,否则不需要评论。
  • 表格单元格是否也是从右到左排列的?让我很困惑。无关文本内容的原因并不是很明显。也许您应该发布一个tidy -i 重新格式化的源示例。
  • @Russell - 解决上述问题将使其 100%
  • 如果您对生成的 HTML 有一定的控制权,或者总是从给定的来源获取它,那么您可以很好地使用 RegEX,因为您可以预料到任何问题,但是对于任意 HTML,然后使用那里的解析器正则表达式可以处理许多特殊情况。

标签: php regex html-parsing


【解决方案1】:

这似乎是表格单元格贪婪的情况。我的测试也给了我一个无关紧要的&lt;td&gt;。但是有一种简单的方法可以使正则表达式更加严格:

$rx = '~<td class="alt1" align="center">.*</td> <td class="alt2" align="center">([\d,]+)</td> </tr>~isU';

这里用\d+ 代替.*? 只返回完全匹配。之前的.*吃得太多了。

一般提示:您可能希望使用 [^&lt;&gt;]* 来安全匹配 html 括号之间的文本内容,而不是 .*。也许应用\s+ 而不仅仅是空格。

【讨论】:

    【解决方案2】:

    不妨试试

    ~<td class="alt2" [^\<\>]+?>([\d,]+)</td>~isU
    

    这假设您感兴趣的tds 总是class="alt2"

    而且可能没有必要逃避 LT 和 GT 标志,即...

    ~<td class="alt2" [^<>]+?>([\d,]+)</td>~isU
    

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2015-06-19
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2015-12-18
      相关资源
      最近更新 更多