удалить таблицу с хтмл кода с определенными строками

Тема в разделе "Регулярные выражения", создана пользователем Liver, 3 дек 2008.

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

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Есть простой код
    Код:
    <table border="0" cellspacing="0" align="right" width="226" cellpadding="0">
      <tr>
        <td>text</td>
      </tr>
    </table>
    
    some text
    
    <table border="0" cellspacing="0" align="right" width="226" cellpadding="0">
      <tr>
        <td>text</td>
      </tr>
    </table>
    
    some text
    
    <table border="0" cellspacing="0" align="right" width="226" cellpadding="0">
      <tr>
        <td class="someclass">text</td>
      </tr>
    </table>
    
    нужно удалить таблицу, где есть ячейка с классом "someclass". Сначала написал решение в лоб.
    Код:
    <table.+?<td class="someclass">.+?</table
    
    Все было замечательно. Но оказалось, что перед этой таблицей могут быть и другие таблицы. И в итоге все вырезается.
    Я даже не знаю в какую сторону начать думать, чтобы написать "не вырезать таблицы, а только эту"
     
  2. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    Измени жадность шаблона на противоположную, чтобы искалось минимально возможное соответствие.
     
  3. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Ничего не понял, но убрал ?. Никакого эффекта. Изменение жадности тут не поможет.

    Но на меня снизошло озарение и выдало вот такой паттерн
    Код:
    $result = preg_replace('%((?:<table.+?<td>.+?</table>.+?)*)<table.+?<td class="someclass">.+?</table>%sim', '$1', $subject);
    
    С этим выражением правильно чиститься тестовый код.
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Все проще на самом деле.
    Код:
    <table(?:(?!</table).)+?<td class="someclass">.+?</table>
    
     
    Liver нравится это.
  5. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91

    Ух. Неужели наконец то мне показали, как делать отрицание. Было б можно, поставил бы 10 спасибо. А где можно прочитать про него? На "(?!" поисковики ничего не находят. А эксперименты на практике не дают полного понимания.
     
  6. coden

    coden Создатель

    Регистр.:
    29 ноя 2008
    Сообщения:
    36
    Симпатии:
    32
    Сам начал понимать данную конструкцию после прочтения книги Фридл Дж. Регулярные выражения (2-е изд.). Лучшая книга именно для понимания, и составления оптимальных рег. выражений.
    Сейчас уже есть (3-е издание) в неё добавлено описание специфики составления регулярных выражений под PHP, но в электронном виде не нашел ее.
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    +1 в пользу Фридла. Очень толковая книга, дает понимание. Можно и второе издание, в третьем мало что добавили. После книги посмотреть маны по PCRE и Perl, чтобы узнать о новых возможностях регулярных выражений.
    pcre
    Perl
     
Статус темы:
Закрыта.