очередной RegExp : немогу сообразить.

  • Автор темы e-statik
  • Дата начала

e-statik

Guest
очередной RegExp : немогу сообразить.

Переменная содержит такой отформаченый текст:
Код:
<lesson>
<task>
много текста много текста много текста
много текста много текста много текста
<hint>
много текста много текста много текста
<lesson>
<task>
много текста много текста много текста
<lesson>
<task>
много текста много текста много текста
<hint>
много текста
<lesson>
<task>
много текста много текста много текста
Закрывающих тегов нет. Нужно порезать на уроки - на блоки текстов между ближайшими тегами <lesson>. И учесть последний вариант, когда текст между <lesson> и концом исходной строки.

Пытаясь получить массив писал
preg_match_all("!<lesson>[^^]*<lesson>!", $file, $result)

Куски вырезались через один - найдя первое вхождение указатель оказывался после второго <lesson> и соответственно второй блок уже выпадал... И так далее..
Попробовал указать смещение - не спасло (видимо не к месту).

Вынуть последний блок пытался
preg_match_all("![^^]*<lesson>[^^]*$!", $file, $result)
- выбирается весь текст сразу (условию соотвествует блок начиная с первого же тега :( ).

Мог бы вставить закрывающие теги - с ними было бы проще, но хочется обойтись без этого.

Читал ФАКи, мануал PHP... Пока придумываются только изощренные варианты не в один ход.
И ещё: как отрицать целое слово (фрагмент)? Например, [^<lesson>] - это же группа символов, которая по идее будет отрицать и "<l>essno" ? Или нет?
Заранее спасибо.
 

Wsc

Guest
Простейший вариант
preg_match_all("!<lesson>(.*)<lesson>!sU", $file, $result)
не катит?
 

e-statik

Guest
Wsc
Нет, не катит. Он будет выдавать нечетные блоки текста. Из-за неудобного сдвига указателя поиска.

SelenIT
Хех, катит.
Но остаётся спортивный интерес!
К тому же мне ещё придётся вернуться к подобным задачам, поэтому мне по-прежнему хочется разобраться, как сделать это через регекспы.
 

e-statik

Guest
fixxxer
О, вот спасибо! Фурыкает.
Правда не всё понятно: надо изучить :)

А как отрицать кусок? Если [^qwerty] отрицает только что-то из символов, представленных в классе, то как исключить целую последовательность (нехочу я например чтобы в результате встречалось слово 'абракадабра' )?
Или это мне уже в ФАКи? :)
 
Сверху