За последние 24 часа нас посетили 21195 программистов и 1634 робота. Сейчас ищут 1479 программистов ...

Помогите плиз сделать условие регулярки

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

  1. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Всем привет!

    У меня есть код парсинга цен, все работает как надо, но появилась загвоздка....

    Вот пример кода для парсинга:

    HTML:
    1. ...
    2. <tr>
    3.    <td><span class="name">Товар 1</span></td>
    4.    <td><span class="price">123 руб.</span></td>
    5. </tr>
    6. <tr>
    7.    <td><span class="name">Товар 2</span></td>
    8.    <td><span class="price">543 руб.</span></td>
    9. </tr>
    10. <tr>
    11.    <td><span class="name">Товар 3</span></td>
    12.    <td><span class="price">8765 руб.</span></td>
    13. </tr>
    14. ...
    Вот регулярка для парсинга:

    PHP:
    1. ...
    2. preg_match_all("/<tr>.*<td><span class=\"name\">(.*)<\/span><\/td>.*<td><span class=\"price\">(.*)\s+руб\.<\/span><\/td>.*<\/tr>/isU", $content, $match, PREG_PATTERN_ORDER);
    3.  
    4. for ($i = 0; $i < count($match[1]); $i++) {
    5.    echo $match[1][$i]." - ";
    6.    echo $match[2][$i]."<br>";
    7. }
    8. ...
    Тут проблем нет, все ок!

    Но появилась задача пропарсить вот такой код:

    HTML:
    1. ...
    2. <tr>
    3.    <td><span class="name">Товар 1</span></td>
    4.    <td><span class="price">123 руб.</span></td>
    5. </tr>
    6. <tr>
    7.    <td><span class="name">Товар 1</span></td>
    8.    <td><span class="price_old">543 руб.</span><span class="price_new">1111 руб.</span></td>
    9. </tr>
    10. <tr>
    11.    <td><span class="name">Товар 1</span></td>
    12.    <td><span class="price">8765 руб.</span></td>
    13. </tr>
    14. ...
    Мне надо выводить только реальные цены, а значит старая цена мне не нужна. И я пытаюсь сделать это так:

    PHP:
    1. ...
    2. preg_match_all("/<tr>.*<td><span class=\"name\">(.*)<\/span><\/td>.*<td>(<span class=\"price\">)|(<span class=\"price_new\">)(.*)\s+руб\.<\/span><\/td>.*<\/tr>/isU", $x, $match, PREG_PATTERN_ORDER);
    3.  
    4. for ($i = 0; $i < count($match[1]); $i++) {
    5.    echo $match[1][$i]." - ";
    6.    echo $match[2][$i]."<br>";
    7. }
    8. ...
    При таком раскладе у меня получается не правильный результат:

    Код (Text):
    1. Товар 1 -
    2. Товар 2 -
    Т.е. получается мне нужно сделать условие для регулярки - совпадение при class= "price_new" и "price".

    Помогите решить эту задачу пожалуйста...
     
  2. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    preg_match_all("/<tr>.*<td><span class=\"name\">(.*)<\/span><\/td>.*<td><span class=\"(?:price|price_new)\">(.*)\s+руб\.<\/span><\/td>.*<\/tr>/isU", $content, $match, PREG_PATTERN_ORDER);
    всё остальное без изменений оставь... по идее должно работать
     
  3. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    titch, спасибо что помогаешь!

    Я попробовал рез. не тот все равно:

    Код (Text):
    1. Товар 1 - 123
    2. Товар 2 - 8765
     
  4. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    preg_match_all("/<tr>.*<td><span class=\"name\">(.*)<\/span><\/td>.*<td>.*<span class=\"(?:price|price_new)\">(.*)\s+руб\.<\/span>.*<\/td>.*<\/tr>/isU", $content, $match, PREG_PATTERN_ORDER);

    а так?
     
  5. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    titch, СПАСИБО ОГРОМНОЕ!!!

    Объясни пожалуйста темному, что значит "?:"
     
  6. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    не ?: а (?:)
    таким образом создается группа, но на неё не выделяется память в стеке. т.е. такая запись позволяется пользоваться всеми благами группы, но при этом в результирующем массиве её нет
     
  7. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    ГУД, я понял, спасибо еще раз!