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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ограничение регулярки строкой таблицы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Мелкий Супермодератор
Отправлено: 18 Мая, 2010 - 23:59:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Имеется приличная габаритно таблица со строками вроде таких:
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

но она, натыкаясь на правильное название улицы, ищет и по всем остальным далее следующим строкам циферки, и если находит, то выкусывает кусок значительно больше нужного. А как соответствие ограничить пределами одной строки таблицы?


-----
PostgreSQL DBA
 
 Top
altermann
Отправлено: 19 Мая, 2010 - 00:54:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Март 2010  
Откуда: Днепропетровск


Помог: 6 раз(а)




Попробуй так: /<tr.*?наличная.*?36.*?<\/tr>/msi
? - это модификатор от "жадности"


-----
Я прирожденный кузнец, я не могу не куя!
 
 Top
Мелкий Супермодератор
Отправлено: 19 Мая, 2010 - 09:39:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Аналогичный результат, плюс обе регулярки возвращают результат, начиная с самого начала таблицы:
Я ночью, пока писал, слегка напутал 2 регулярки:
/<tr.*наличная.*36.*<\/tr>/msi - эта возвращает всё, начиная с первой строки и до строки с цифрами 36, при наличии улицы где-то посередине
/наличная.*36/mUsi - эта ближе всего к правде, но возвращает все строки между улицей и номером дома.

Впрочем, уже решил задачу, что называется, в лоб: через preg_replace_callback вырезал во всех /<tr.*<\/tr>/msi \n
И потом через /<tr.*наличная.*36.*<\/tr>/mi получается адекватный результат уже.
Но хотелось бы знать, как это решить нормальным путём Закатив глазки


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 19 Мая, 2010 - 15:43:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Мелкий пишет:
А как проверить, есть ли в таблице в одной строке допустим "наличная" и 36?
Во-первых для требуемого вам поиска нужно использовать нежадные версии квантификаторов с модификатором ? - ведь вы ищите соседние данные и универасальный шаблон между ними должен стремиться совпасть как можно с меньшим числом символов Во-вторых можете посмотреть в сторону операцией поиска вперед и поиска назад в регулярном выражении


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Мелкий Супермодератор
Отправлено: 19 Мая, 2010 - 17:05:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А в регулярках нельзя указать "вот тут может быть всё, что угодно, кроме </tr>"?

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

Реагирует адекватно Хорошо


-----
PostgreSQL DBA
 
 Top
Champion Супермодератор
Отправлено: 19 Мая, 2010 - 19:26:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Под .+ может попадать, что угодно. Поэтому, если документ хоть немного структурирован, нужно составлять более жесткую регулярку:
PHP:
скопировать код в буфер обмена
  1. /<P>НАЛИЧНАЯ[^<]*<\/P></TD>[^<]*<TD[^>]*>[^<]*<P>36[^<]*<\/P><\/TD/msi

(Добавление)
Мелкий пишет:
(?(?<!<\/tr>).|известноневалидныйнабортекста)*
Можно с таким же успехом нежадной .* добраться до ближайшего <\/tr>)
 
 Top
trot
Отправлено: 19 Мая, 2010 - 22:59:59
Post Id


Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. <TR>((?<!<\/TR>).)*НАЛИЧНАЯ((?<!<\/TR>).)*36((?<!<\/TR>).)*(\/TR)


вроде работает
 
 Top
JustUserR
Отправлено: 20 Мая, 2010 - 16:39:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




trot пишет:
Вроде работает
Да только для организации незапоминающих круглых скобок используется конструкция ?: после открывающей скобки


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB