2011-02-10 254 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