Помогите с регулярным выражением

Тема в разделе "Регулярные выражения", создана пользователем Tima111, 12 фев 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Tima111

    Tima111 Читатель

    Заблокирован
    Регистр.:
    5 июл 2007
    Сообщения:
    218
    Симпатии:
    486
    Всем привет. Прошу помочь составить регулярное выражение, чтобы его смысл не изменился. У самого не получается, уже испробовал разные варианты. Ещё не понимаю что значит конструкция (?: )

    Вот код для отладки:
    PHP:
    <?php
    $str
    =file_get_contents('http://market.yandex.ru/guru.xml?hid=294661&CMD=-RR=0,0,0,0-PF=1801946%2BEQ%2Bsel%2B6715129-VIS=201E2-CAT_ID=971072-BPOS=10-EXC=1-PG=10&greed_mode=false');
    $pattern '/<h3 class="b-offers__title"><a [a-zA-Z0-9\-\=\"]{0,} class="b-offers__name" href="(.*)">(.*)<\/a>(?:<sup class="b-offers__new">новинка<\/sup>|)(?:<span class="b-rating b-rating_type_10 b-rating_type_model">.*<\/span>|)<\/h3><div class="b-offers__price">(.*)<\/div><p class="b-offers__spec">(.*)<\/p>/sU';
    preg_match_all($pattern,$str,$test);
    print_R($test);
    ?>
    Раньше работало, сейчас не работает, т.к. код маркета изменился. Нужно сделать так чтобы структура вывода оставалась прежней...
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.431
    У тебя скрипт ищет новинки
    PHP:
    (?:<sup class="b-offers__new">новинка<\/sup>|)
    На той странице, которая загружается, таковых нет.
    Уточни, что именно ты хочешь спарсить?
     
    Tima111 нравится это.
  3. Tima111

    Tima111 Читатель

    Заблокирован
    Регистр.:
    5 июл 2007
    Сообщения:
    218
    Симпатии:
    486
    latteo, спасибо что отозвался :)
    Скрипт не мой, не знаю где искать автора... Скрипт перестал работать и мне нужно восстановить его работоспособность.
    Не работает регулярное выражение. Комментарий к этому регулярному выражению:
    PHP:
     //шаблон для получения названия товара и ссылки на подробное описание и краткого описания товара
    Нужно сделать так, чтобы структура вывода в массив была прежней...
    Т.е. чтобы скрипт работал дальше.
    Там нужно только это регулярное выражение исправить.

    Может эта конструкция (?: ) значит необязательное нахождение на странице?
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.431
    Попробуй
    PHP:
    $pattern '/<h3 class="b-offers__title"><a [a-zA-Z0-9\-\=\"]{0,} class="b-offers__name" href="(.*)">(.*)<\/a>(?:<sup class="b-offers__new">новинка<\/sup>|)(?:<span class="b-rating b-rating_type_10 b-rating_type_model" title=".*">.*<\/span>|)<\/h3><div class="b-offers__price">(.*)<\/div><p class="b-offers__spec">(.*)<\/p>/sU';
    Ага, это я выше не совсем разобрался.
     
    Tima111 нравится это.
  5. Tima111

    Tima111 Читатель

    Заблокирован
    Регистр.:
    5 июл 2007
    Сообщения:
    218
    Симпатии:
    486
    latteo, спасибо, в коде для отладки работает. Правда не знаю какая структура вывода должна быть, т.е. как они должны по порядку идти... Нумерация массивов...
    Если добавилось title=".*" нумерация массива ведь может нарушиться.
    Спасибо за помощь, попробую дальше своими силами :)
     
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.549
    Симпатии:
    1.431
    Нумерация добаится, если написать в скобочках title="(.*)"
    Так что должно все работать.
     
  7. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    319
    Симпатии:
    124
    Нет
    (?: ) - группирует в один паттерн, как и ( ), но не запоминает его.
    Пример: (1)( ?:2)(3) запомнит 1-ю и 3-ю группу.
     
Статус темы:
Закрыта.