Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ограничение регулярки строкой таблицы
Форумы портала PHP.SU » PHP » Регулярные выражения » ограничение регулярки строкой таблицы

Страниц (1): [1]
 

1. Мелкий - 18 Мая, 2010 - 23:59:40 - перейти к сообщению
Имеется приличная габаритно таблица со строками вроде таких:
CODE (html):
скопировать код в буфер обмена
  1. <TR>
  2. <TD class=alignleft vAlign=center>
  3. <P>МОСКОВСКОЕ ШОССЕ&nbsp;</P></TD>
  4. <TD class=ailgnright vAlign=center>30</TD>
  5. <TD class=ailgnright vAlign=center>2</TD></TR>
  6. <TR>
  7. <TR>
  8. <TD class=alignleft vAlign=center>
  9. <P>НАЛИЧНАЯ УЛ. </P></TD>
  10. <TD vAlign=bottom>
  11. <P>36 </P></TD>
  12. <TD vAlign=bottom>
  13. <P>6 </P></TD></TR>
  14. <TR>


А как проверить, есть ли в таблице в одной строке допустим "наличная" и 36?
Пробовал такой регуляркой:
CODE (htmlphp):
скопировать код в буфер обмена
  1. /<tr.*наличная.*36.*<\/tr>/msi

но она, натыкаясь на правильное название улицы, ищет и по всем остальным далее следующим строкам циферки, и если находит, то выкусывает кусок значительно больше нужного. А как соответствие ограничить пределами одной строки таблицы?
2. altermann - 19 Мая, 2010 - 00:54:14 - перейти к сообщению
Попробуй так: /<tr.*?наличная.*?36.*?<\/tr>/msi
? - это модификатор от "жадности"
3. Мелкий - 19 Мая, 2010 - 09:39:32 - перейти к сообщению
Аналогичный результат, плюс обе регулярки возвращают результат, начиная с самого начала таблицы:
Я ночью, пока писал, слегка напутал 2 регулярки:
/<tr.*наличная.*36.*<\/tr>/msi - эта возвращает всё, начиная с первой строки и до строки с цифрами 36, при наличии улицы где-то посередине
/наличная.*36/mUsi - эта ближе всего к правде, но возвращает все строки между улицей и номером дома.

Впрочем, уже решил задачу, что называется, в лоб: через preg_replace_callback вырезал во всех /<tr.*<\/tr>/msi \n
И потом через /<tr.*наличная.*36.*<\/tr>/mi получается адекватный результат уже.
Но хотелось бы знать, как это решить нормальным путём Закатив глазки
4. JustUserR - 19 Мая, 2010 - 15:43:59 - перейти к сообщению
Мелкий пишет:
А как проверить, есть ли в таблице в одной строке допустим "наличная" и 36?
Во-первых для требуемого вам поиска нужно использовать нежадные версии квантификаторов с модификатором ? - ведь вы ищите соседние данные и универасальный шаблон между ними должен стремиться совпасть как можно с меньшим числом символов Во-вторых можете посмотреть в сторону операцией поиска вперед и поиска назад в регулярном выражении
5. Мелкий - 19 Мая, 2010 - 17:05:37 - перейти к сообщению
А в регулярках нельзя указать "вот тут может быть всё, что угодно, кроме </tr>"?

Вот, докурил маны по этому вопросу, получилось такая хренька:
CODE (regexp):
скопировать код в буфер обмена
  1. /наличная(?(?<!<\/tr>).|известноневалидныйнабортекста)*\D36\D/mUsi

Реагирует адекватно Хорошо
6. Champion - 19 Мая, 2010 - 19:26:59 - перейти к сообщению
Под .+ может попадать, что угодно. Поэтому, если документ хоть немного структурирован, нужно составлять более жесткую регулярку:
PHP:
скопировать код в буфер обмена
  1. /<P>НАЛИЧНАЯ[^<]*<\/P></TD>[^<]*<TD[^>]*>[^<]*<P>36[^<]*<\/P><\/TD/msi

(Добавление)
Мелкий пишет:
(?(?<!<\/tr>).|известноневалидныйнабортекста)*
Можно с таким же успехом нежадной .* добраться до ближайшего <\/tr>)
7. trot - 19 Мая, 2010 - 22:59:59 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. <TR>((?<!<\/TR>).)*НАЛИЧНАЯ((?<!<\/TR>).)*36((?<!<\/TR>).)*(\/TR)


вроде работает
8. JustUserR - 20 Мая, 2010 - 16:39:33 - перейти к сообщению
trot пишет:
Вроде работает
Да только для организации незапоминающих круглых скобок используется конструкция ?: после открывающей скобки

 

Powered by ExBB FM 1.0 RC1