Xpoint
   [напомнить пароль]

Как оптимизировать регулярное выражение?

Метки: [без меток]
[удл]
2011-02-19 18:59:10 [обр] Владимир[досье]

Есть html-код вида

<table><tbody><tr><td>01.02.2009-28.02.2009</td><td>3776</td><td>&nbsp;</td><td>01.10.2009-31.10.2009</td><td>3424</td><td>&nbsp;</td><td>01.06.2010-30.06.2010</td><td>3457</td><td>&nbsp;</td></tr><tr><td>01.03.2009-31.03.2009</td><td>3665</td><td>&nbsp;</td><td>01.11.2009-30.11.2009</td><td>3716</td><td>&nbsp;</td><td>01.07.2010-31.07.2010</td><td>3208</td><td>&nbsp;</td></tr><tr><td>01.04.2009-30.04.2009</td><td>3377</td><td>&nbsp;</td><td>01.12.2009-31.12.2009</td><td>3735</td><td>&nbsp;</td><td>01.08.2010-31.08.2010</td><td>3276</td><td>&nbsp;</td></tr><tr><td>01.05.2009-31.05.2009</td><td>2706</td><td>&nbsp;</td><td>01.01.2010-31.01.2010</td><td>3398</td><td>&nbsp;</td><td>01.09.2010-30.09.2010</td><td>4093</td><td>&nbsp;</td></tr><tr><td>01.06.2009-30.06.2009</td><td>3579</td><td>&nbsp;</td><td>01.02.2010-28.02.2010</td><td>4042</td><td>&nbsp;</td><td>01.10.2010-31.10.2010</td><td>4911</td><td>&nbsp;</td></tr><tr><td>01.07.2009-31.07.2009</td><td>2606</td><td>&nbsp;</td><td>01.03.2010-31.03.2010</td><td>4006</td><td>&nbsp;</td><td>01.11.2010-30.11.2010</td><td>4764</td><td>&nbsp;</td></tr><tr><td>01.08.2009-31.08.2009</td><td>3135</td><td>&nbsp;</td><td>01.04.2010-30.04.2010</td><td>3599</td><td>&nbsp;</td><td>01.12.2010-31.12.2010</td><td>4243</td><td>&nbsp;</td></tr><tr><td>01.09.2009-30.09.2009</td><td>3144</td><td>&nbsp;</td><td>01.05.2010-31.05.2010</td><td>3666</td><td>&nbsp;</td></tr></tbody></table>

Это таблица, в которой 8 столбцов. Нужно выкусить все строки, в которых есть 3 раза чередование. "диапазон дат" "число" "&nbsp;"

Написал прототип выражения

<tr><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td></tr>

Проверяю в RegexBuddy на примере кода, приведенного выше - тест проходит корректно.
А вот в скрипте уже не работает

preg_match_all('/<tr><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</td><td>[0-9]+</td><td>&nbsp;</td></tr>/', $wordstat_table, $full_string);

Начал поэтапно проверять выражение

Этап 1
preg_match_all('/<tr><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+</', $wordstat_table, $full_string);
Этап 2
preg_match_all('/<tr><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+<\/td>/', $wordstat_table, $full_string);
Этап 3
preg_match_all('/<tr><td>([0-9])+\.([0-9])+\.([0-9])+-([0-9])+\.([0-9])+\.([0-9])+<\/td><td>/', $wordstat_table, $full_string);

Скрипт на первом этапе корректно работает, на втором тоже, а вот на третьем уже проблема.

Можно ли выражение оптимизировать так, чтобы не было проблем со слешем?
Заранее спасибо.

спустя 2 часа 37 минут [обр] Lynn «Кофеман»(98/571)[досье]
Во-первых, используйте форматирование.
Во-вторых, можно использовать другой ограничитель регулярного выражения.
В-третьих, такие задачи лучше решать не регулярными выражениями, а DOM-ом.
спустя 3 часа 29 минут [обр] sevalery[досье]
Я думаю тут есть ответ!!!
http://www.opennet.ru/base/dev/php_regular.txt.html
спустя 1 день 10 часов [обр] Павел Карасёв(0/14)[досье]

Владимир[досье]
Наверное вы ошиблись - у вас 8 строк, и 3 столбца.
Вместо разбивания рег.выражения на части, попробуйте сделать поиск в несколько шагов:

  1. найдите строчки <tr>
  2. найдите в строчках свои диапазоны
  3. проверьте соответствия

зы. я вообще всегда использую ограничители # или |, слеши - это страх и ненависть ))

спустя 4 дня [обр] Владимир[досье]
Всем откликнувшимся спасибо! Вопрос решен.
Powered by POEM™ Engine Copyright © 2002-2005