2011-02-10 2 views
1

Приветствую всехРегулярное выражение не работает

У меня есть это регулярное выражение, которое идет следующим образом:

$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 
) 

Спасибо за вашу помощь. Imran

+1

Не анализировать html с регулярным выражением (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). Так что не пытайтесь ... – ircmaxell

+0

Пожалуйста, не делайте свои идеи другим. Пусть у каждого будет свое собственное мнение. Я использую его в своем контексте и был очень успешным с 90% моей работы. Это всего лишь одна маленькая вещь, которая застревает, если вы можете помочь ее alrite, иначе не нужно комментировать. –

+1

Достаточно ли 90% для вас? –

ответ

4

Это, кажется, случай жадности таблицы. Мой тест также дал мне посторонний <td>. Но есть простой способ сделать регулярное выражение более жестким:

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

Здесь \d+ используется вместо .*? возвращается только точные совпадения. Предыдущие .* слишком много ели.

Общий совет: вы можете использовать [^<>]* для безопасного сопоставления текстового содержимого между скобками html, а не .*. Возможно, примените \s+ вместо просто пробелов.

+0

MashAllah, приятный ответ, спасибо за вашу помощь –

0

Может попробовать

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

Это предполагает, что td s вы заинтересованы в всегда в class="alt2"

И, наверное, нет необходимости, чтобы избежать признаков LT и GT есть ...

~<td class="alt2" [^<>]+?>([\d,]+)</td>~isU 
Смежные вопросы