ФорумПрограммированиеPHP для идиотов → regexp - поиск строки с обязательным наличием определенной подстроки ?

regexp - поиск строки с обязательным наличием определенной подстроки ?

  • Pasha_Moscow

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 апреля 2009 г. 4:16

    Добрый день!

    Подскажите, как искать последовательность с известными границами и именно с наличием определенного текста, если в тексте строк с такими границами может быть несколько ?
    То есть нужно найти
    <table …>…. XXX …. </table> в тексте, где таблиц несколько, в т.ч. вложенных. Но таблица, где есть последовательность XXX (она может быть в этой таблице несколько раз, но достаточно одного) только одна.

    \<table.+?XXX.+?\<\/table\>

    выбирает текст от первого в тексте открывающего тега <table до закрывающего </table>, следующего за XXX
    То есть вторую границу он определяет правильно, а первую - нет.

    Возможно, нужно каким-то образом идти от найденного XXX обратно влево до <table ?
    Почему +? не ищет минимально короткую последовательность, попадающую в границу от <table до XXX ?
  • welder

    Сообщения: 2945 Репутация: N Группа: в ухо

    Spritz 28 апреля 2009 г. 4:19, спустя 2 минуты 42 секунды

    я если честно 2 раза прочитал так и не понял

    может выложиш хтмл код и то что тебе из него надо найти =)
  • Pasha_Moscow

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 апреля 2009 г. 4:24, спустя 5 минут 24 секунды

    Вот, к примеру

    <table>
    ABC
    </table>

    <table>
    <table>
    DEF
    </table>
    </table>

    <table>
    XXX
    </table>

    выделяется от самой первой table, а нужно от той, что непосредственное перед XXX
  • welder

    Сообщения: 2945 Репутация: N Группа: в ухо

    Spritz 28 апреля 2009 г. 4:27, спустя 2 минуты 44 секунды

    а php  код какой ? как ты пытаешся достать таблицу то ?
  • Pasha_Moscow

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 апреля 2009 г. 4:39, спустя 11 минут 44 секунды

    как обычно, файл из URL-адреса в переменную, а потом её preg_match_all. Среди многих таблиц нужно найти именно эту.
    Почему забирается строка максимальной длины между <table и XXX, а не минимальной ? Разве +? подразумевает не это ?

  • welder

    Сообщения: 2945 Репутация: N Группа: в ухо

    Spritz 28 апреля 2009 г. 4:55, спустя 16 минут 1 секунду

    [man]reference.pcre.pattern.modifiers[/man]



    U (PCRE_UNGREEDY)
    Этот модификатор инвертирует жадность квантификаторов, таким образом они по умолчанию не жадные. Но становятся жадными, если за ними следует символ '?'. Такая возможность не совместима с Perl. Модификатор U также может использоваться внутри шаблона, при помощи '?U' записи.
  • Pasha_Moscow

    Сообщения: 12 Репутация: N Группа: Кто попало

    Spritz 28 апреля 2009 г. 7:27, спустя 2 часа 32 минуты 33 секунды

    Не получается
    !<table>.*XXX.*</table>!isU (вроде бы это тоже, что и !<table>.*?XXX.*?</table>!is )

    проверял здесь
    http://pyha.ru/fishki/regexp/


    выбирает всю таблицу от открывающего тега в самом начале до тега </table>после ХХХ.

    <table>
    ABC
    </table>

    <table>
            <table>
            DEF
          </table>
    </table>

    <table>
    12XXX35
    </table>

    <table>
    YYYYYYY
    </table>

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

    Если делаю lookbehind
    (?!=<table)..XXX.+?</table>
    то все ОК, но только потому, что я знаю, что перед ХХХ именно два знака. Если число знаков неизвестно, и я пишу брать любой, но как можно меньше, то берется все с самого начала.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!