powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение, не могу сообразить
12 сообщений из 12, страница 1 из 1
(PHP) Регулярное выражение, не могу сообразить
    #33046238
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переменная содержит такой отформаченый текст:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<lesson>
<task>
много текста много текста много текста
много текста много текста много текста
<hint>
много текста много текста много текста
<lesson>
<task>
много текста много текста много текста
<lesson>
<task>
много текста много текста много текста
<hint>
много текста
<lesson>
<task>
много текста много текста много текста
Закрывающих тегов нет. Нужно порезать на уроки - на блоки текстов между ближайшими тегами <lesson>. И учесть последний вариант, когда текст между <lesson> и концом исходной строки.

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

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

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

Читал ФАКи, мануал PHP... Пока придумываются только изощренные варианты не в один ход.
И ещё: как отрицать целое слово (фрагмент)? Например, [^<lesson>] - это же группа символов, которая по идее будет отрицать и "<l>essno" ? Или нет?
Заранее спасибо.
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046263
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не выпадали блоки, видимо, надо смещение -8 (на длину "<lesson>") использовать... Подсмотрел в близкой теме.
А чтоб захватить последний блок?
Подозреваю, что условие должно быть типа "что-то начинающееся на <lesson>, содержащее что угодно, кроме <lesson> и до конца строки $"... Но написать пока немгу :/
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046369
DarkBoatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не силен в рег. выражениях ПХП. Но идея такая.
Первый блок - текст между <lesson> и <lesson>.
Серединные блоки - текст от текущей точки до <lesson>
Последний блок - текст до конца
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046397
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но я это уже понял. Т.е. логику поиска я представляю.
Не хватает опыта в составлении самих выражений :(
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046400
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
со смещением я тоже что-то напутал - не помогло.
Так что все задачи по-прежнему актуальны.
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046850
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ParanoikПытаясь получить массив писал
Код: plaintext
preg_match_all("!<lesson>[^^]*<lesson>!", $file, $result)


Все потому, что пользовался негодным инструментом - preg_match_all.
Используй preg_split:
Код: plaintext
$result = preg_split("!<lesson>\r\n!", $file, - 1 , PREG_SPLIT_NO_EMPTY);

Обрати внимание - '\r\n' это досовский перевод строки. Твой текст может иметь и другой разделитель строк, тогда вместо '\r\n' подставь его.
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33046856
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, кстати, можно и так: '!<lesson>\s*!'. Так даже лучше.
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33047019
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про назначение сплита я помнил, но не думал о нём, почему-то надеясь, что задача по зубам preg_match_all ... Я его переоценил в универсальности? :)

С \r\n и \s понятно: я привел утрированный пример и в реальной задаче переводов не будет. Но суть имею в виду :)

А всё-таки... Как из шаблона исключить строку? Или это меня пинками в ФАКи? :) А?...

Спасибо за помощь!
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33047115
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ParanoikПро назначение сплита я помнил, но не думал о нём, почему-то надеясь, что задача по зубам preg_match_all ... Я его переоценил в универсальности? :)

Для этого примера, вообще-то, достаточно explode:
$result = explode( "<lesson>\r\n", $file );

А если тебе очень-очень хочется сделать это регекспом, используй lookahead/lookbehind конструкции. Но с ними php начинает ТАК тормозить, что результата на любом более-менее объемном тесте ты просто устанешь ждать.

Вообще нет смысла использовать регэкспы там, где они не нужны - их
использование это всегда удар по производительности. Но предсказатели в php - это вообще "что-то особенного" (с)
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33047233
Paranoik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На phpclub.ru подсказали решение с preg_match_all:
Код: plaintext
!<lesson>(.*?)(?=<lesson>|$)!s
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33047542
ap99ap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ParanoikНа phpclub.ru подсказали решение с preg_match_all:
Код: plaintext
!<lesson>(.*?)(?=<lesson>|$)!s


(?=<lesson>) это и есть lookahead. По моим наблюдениям такие выражения очень сильно тормозат.
...
Рейтинг: 0 / 0
(PHP) Регулярное выражение, не могу сообразить
    #33047561
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Paranoik
P> С \r\n и \s понятно: я привел утрированный пример и в реальной задаче
P> переводов не будет. Но суть имею в виду :)
Просто мысль.. если нет специальных разделителей, то использовать сам тег <LESSON> в качестве его, т.е. брать подстроки
от "SON>" до "<LES". Если не в кассу, то извеняйте...

--
Dik76

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение, не могу сообразить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]