2011-02-10 207 views
1

问候大家正则表达式不工作

我有这样的正则表达式,去如下:

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

这样做的目的是让所有“若干意见”(左起第一列)此样本线程网址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 
) 

感谢您的帮助。 Imran

+1

不要[用正则表达式解析html](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。所以不要尝试... – ircmaxell 2011-02-10 11:48:17

+0

请不要将您的想法提供给其他人。让每个人都有自己的看法。我在我的背景中使用它,并且在我的工作中有90%非常成功。这只是一个小问题,如果你可以帮助其alrite,那么它就会被卡住,否则不需要评论。 – 2011-02-10 11:52:43

回答

4

它似乎是表格单元格贪婪的情况。我的测试也给了我一个无关的<td>。但是有一个简单的方法,使正则表达式更加严格:

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

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

一般提示:您可能希望使用[^<>]*在HTML括号之间安全地匹配文本内容,而不是.*。也许应用\s+而不只是空格。

0

也许尝试

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

这假定td是你感兴趣的是class="alt2"

始终,可能没有必要逃避LT和GT的标志即...

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