Не могу разобрать с регулярным выражением

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

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

    STsoldier Постоялец

    Регистр.:
    9 дек 2008
    Сообщения:
    100
    Симпатии:
    10
    Есть HTML код:
    HTML:
    <tr>
    <td class='left'>some txt <span style='color:#444'>OK</span></td>
    <td class='left'>some txt</td>
    </tr>
    <tr>
    <td class='left'>some txt <span style='color:#ffffff'>OK</span></td>
    <td class='left'>some txt</td>
    </tr>
    <tr>
    <td class='left'>some txt <span style='color:#ff0000'>OK</span></td>
    <td class='left'>some txt</td>
    </tr>
    <tr>
    <td class='left'>some txt <span style='color:#ffffff'>OK</span></td>
    <td class='left'>some txt</td>
    </tr>
    Я написал регулярное выражение, чтобы получить все между <tr>...</tr> имеющее внутри color:#ff0000. Вот оно
    <tr>.*<span style='color:#ff0000'>OK<\/span>.*?<\/tr>
    Но это выражение находит не один блок <tr>...</tr>, а еще два расположенных выше.
    Какое нужно регулярное выражение, чтобы найти четко блок <tr>...</tr> имеющий внутри color:#ff0000 ? Спасибо.
     
  2. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    быстрее будет работать, если выбрать все данные между <tr></tr>, а потом пробежаться по ним в цикле и проверить на вхождение строки:

    PHP:
    $html = <<<HTML
    <tr>
        <td class='left'>some txt <span style='color:#444'>OK</span></td>
        <td class='left'>some txt</td>
    </tr>
    <tr>
        <td class='left'>some txt <span style='color:#ffffff'>OK</span></td>
        <td class='left'>some txt</td>
    </tr>
    <tr>
        <td class='left'>some txt <span style='color:#ff0000'>OK</span></td>
        <td class='left'>some txt</td>
    </tr>
    <tr>
        <td class='left'>some txt <span style='color:#ffffff'>OK</span></td>
        <td class='left'>some txt</td>
    </tr>
    HTML;

    preg_match_all("`<tr>(.*?)<\/tr>`is"$html$res);

    $return = array();
    foreach(
    $res[1] as $tr)
    {
        if(
    strpos($tr"#ff0000") !== false)
            
    $return[] = trim($tr);
    }

    print_r($return);
     
    STsoldier нравится это.
  3. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    778
    Симпатии:
    233
    такой вариант
    Код:
    <td.*>.*<span style='color:#ff0000'>OK<\/span>.*?<\/td>
    тоже работает.
     
  4. droid

    droid Создатель

    Регистр.:
    2 авг 2011
    Сообщения:
    37
    Симпатии:
    4
    я осмелюс порекомендовать вариант:
    Код:
    <td.*?'color:#ff0000'.*?</td>
    ТС просил блок содержащий цвет без остальных примочек.
     
Статус темы:
Закрыта.