Регулярное выражение не работает - PullRequest
1 голос
/ 10 февраля 2011

Приветствую всех

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

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

Спасибо за вашу помощь.Имран

Ответы [ 2 ]

4 голосов
/ 10 февраля 2011

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

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

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

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

0 голосов
/ 10 февраля 2011

Возможно, попытайтесь

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

Это предполагает, что td, которые вас интересуют, всегда имеют class="alt2"

И, вероятно, нет необходимости избегать знаков LT и GTто есть ...

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