Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

RegExp. Регулярки с условием

256
23 декабря 2011 года
foxweb
1.0K / / 27.07.2005
Введение
Пишу в связи с тем, что у меня отсутствует участок мозга, отвечающий за регулярки (этот же участок отвечал за понимание матана и теории компиляторов в институте, поэтому у меня всегда был неуд с натяжкой). Также я убеждён, что на этом форуме обитают эксперты, для которых мой случай — как семечки щёлкать :)

Дано
исходная ссылка.

Задача
Пишу парсер. Обвязка готова, дело за главным.
Надо вытащить актуальные цены. У меня цены вытаскиваются все, без разбора.
Хотелось бы сделать такую логику:
Tax fare вытаскивается отдельным проходом (это у меня готово).
Если есть Your fare — берём эту цену, иначе берём Launch fare.
Иногда попадается Sold Out, тогда записываем как есть.

На выходе — массив строго из 5 элементов.
У меня получается столько элементов, сколько всего цен. Мои реги на работе остались, утром вышлю. Вдруг поможет.

Читал эту ссылку, что-то вроде получалось, но истина всё ещё где-то рядом. http://www.regular-expressions.info/conditional.html

Всем хорошего дня и с наступающим новым годом :)
366
23 декабря 2011 года
int
668 / / 30.03.2005
Тебе надо в конце регулярки сделать скобку с вопросительным знаком: (?:your fare: (.+?)\*)?, а потом посчитать размерность массива с совпадениями. Не знаю только, надо что ли звёздочку экранировать
256
23 декабря 2011 года
foxweb
1.0K / / 27.07.2005
Сейчас пока так, но это не то что нужно — загребает обе цены.


 
Код:
(your-fare|launch-fare).*?<div class="amount.*?">(\$[0-9,]{2,6}\.[0-9]{2})\*|Sold Out

13
23 декабря 2011 года
RussianSpy
3.0K / / 04.07.2006
Я бы не стал в данном случае сношать себе мозг регулярками, а воспользовался бы html парсером. С помощью того же phpQuery я некоторое время назад просканировал около десятка интернет-магазинов, выдрав оттуда цены и информацию о товарах.
244
23 декабря 2011 года
UAS
2.0K / / 19.07.2006
С регуляркой такой слишком натяжно сделать.
Можете воспользоваться позитивным и негативным просмотром вперед или назад + в самой регулярке использовать группировки. В любом случае, это выходит действительно слишком сложно и муторно.

Я бы предложил разбивать эти 5 ячеек на 5 отдельных строк и уже для каждой применять более мелкую регулярку. Менее масштабную, чем в ваших грандиозных планах.
10
23 декабря 2011 года
Freeman
3.2K / / 06.03.2004
В совете RussianSpy виден опыт. Присоединяюсь. Эта задача -- не для регулярок.
256
23 декабря 2011 года
foxweb
1.0K / / 27.07.2005
То есть, решить задачу при помощи сторонней библиотеки или велосипеда — это более крутой опыт, чем одно красивое регулярное выражение? :)
Впрочем, я сейчас решаю задачу в два прохода. За первый проход выделяем блоки с ценами и их имена, во втором — сами цены или Sold Out.
256
23 декабря 2011 года
foxweb
1.0K / / 27.07.2005
Правильный ответ: http://pastie.org/3062154
13
23 декабря 2011 года
RussianSpy
3.0K / / 04.07.2006
Цитата: foxweb
То есть, решить задачу при помощи сторонней библиотеки или велосипеда — это более крутой опыт, чем одно красивое регулярное выражение? :)
Впрочем, я сейчас решаю задачу в два прохода. За первый проход выделяем блоки с ценами и их имена, во втором — сами цены или Sold Out.



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

Цитата: foxweb
Правильный ответ: http://pastie.org/3062154


Ну молодец, что решил. Вообще в программировании почти всегда задача имеет несколько решений (а бывает что и несколько десятков). Чем больше у программиста опыта, тем больше решений он видит, и тем сложнее порой выбрать верное. Но есть задачи, у которых много верных решений, поэтому выбор становится вопросом одного лишь вкуса и привычек.

2
25 декабря 2011 года
squirL
5.6K / / 13.08.2003
Цитата: foxweb
То есть, решить задачу при помощи сторонней библиотеки или велосипеда — это более крутой опыт, чем одно красивое регулярное выражение? :)
.


красивое регулярное выражение лучше, с точки зрения чистого искусства. если подумать и залезть "под капот" регулярке, то ты очень быстро отучишься использовать их направо-налево.

5
25 декабря 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: squirL
красивое регулярное выражение лучше, с точки зрения чистого искусства

Красивым оно не может быть в принципе, хотя я видимо ангажирован знанием об их устройстве.
Присоединяюсь к ораторам о необходимости использовать готовый HTML парсер, желательно поддерживающий язык запросов XPath - в этом случае при обновлении схемы данных (структуры страницы) придется исправить лишь этот запрос.

5
25 декабря 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: foxweb
Правильный ответ: http://pastie.org/3062154



Кошмарный ужас :)

2
25 декабря 2011 года
squirL
5.6K / / 13.08.2003
Цитата: hardcase
Красивым оно не может быть в принципе, хотя я видимо ангажирован знанием об их устройстве.
.


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог