URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6919
[ Назад ]

Исходное сообщение
"regexp, отрицание подстоки в строке"

Отправлено procool , 07-Ноя-07 21:58 
Привет всем!
немогу понять как сделать простое отрицание, приведу пример:
"tag какая то строка tagc" - должно пропустить
"tag какая tag то строка tagc" - нет
"tag какая то строка tag еще строка tagc tagc " должно вырезаьть "еще строка"

пробывал разное, например /$tag(?!$tag)$tagc/ или бред типа /$tag(?:.(?!$tag)*)$tagc/,
как то легче не стало.
Буду благодарен за совет!
regards, procool@


Содержание

Сообщения в этом обсуждении
"regexp, отрицание подстоки в строке"
Отправлено angra , 08-Ноя-07 07:06 
Не сказал бы что это простое отрицание. Хотя бы потому что вряд ли это доступно на не PCRE.
Для начала внятно ставим задачу: нужно захватить произвольной длинны последовательность произвольных символов, в которой не встречается определенная подстрока. Теперь немного переформулируем, ограничение подстроки перенесем в определение подходящих символов, то есть подходящими символами являются те за которыми не следует определенная подстрока. Такая проверка делается, как вы правильно догадались, на основе заглядывания вперед. теперь собираем
.  - произвольный символ
.(?!$tag)  - произвольный символ, за которым не идет подстрока
(?:.(?!$tag)) - группировка для quantifier
(?:.(?!$tag))* - собственно искомая последовательность
((?:.(?!$tag))*) - искомая последовательность с захватом


P.S. Исходя из примеров могу предположить, что более широкой задачей является парсинг тегов.  И похоже решать вы ее собрались неправильным способом, но он привел к задаче, которую интересно было решить :)


"regexp, отрицание подстоки в строке"
Отправлено procool , 08-Ноя-07 20:09 
>P.S. Исходя из примеров могу предположить, что более широкой задачей является парсинг
>тегов.  И похоже решать вы ее собрались неправильным способом, но
>он привел к задаче, которую интересно было решить :)

Спасибо тебе. вообще давно хотелось сделать модуль один - некий smarttag, который позволял бы объектными методами работать с парсингом темплейтов и заменять в них какие то данные на то что хотелось бы пользователю.
Это могли быть любые теги, например список пользователей или список комнат на чате со вложенным списком пользователей, у которых еще есть вложеный список флагов.
Притом сделать управление обработки этих тегов максимально простым и чтобы программисту неприходилось задумываться о парсинге вообще.

Реализация которую ты предложил работает, спасибо тебе огромное. Но идея действительно была немного неверна - так как она требует буфферизации. А я думаю никому не захочется буферизировать весь список пользователей или правил фаервола или чего там еще может быть.. потому я оставлю наработку как вариант но пойду другим путем - поступательного вывода.
Если будет интересно - выложу пожже рабочий модуль с описанием.

regards, procool@