Привет всем!
немогу понять как сделать простое отрицание, приведу пример:
"tag какая то строка tagc" - должно пропустить
"tag какая tag то строка tagc" - нет
"tag какая то строка tag еще строка tagc tagc " должно вырезаьть "еще строка"пробывал разное, например /$tag(?!$tag)$tagc/ или бред типа /$tag(?:.(?!$tag)*)$tagc/,
как то легче не стало.
Буду благодарен за совет!
regards, procool@
Не сказал бы что это простое отрицание. Хотя бы потому что вряд ли это доступно на не PCRE.
Для начала внятно ставим задачу: нужно захватить произвольной длинны последовательность произвольных символов, в которой не встречается определенная подстрока. Теперь немного переформулируем, ограничение подстроки перенесем в определение подходящих символов, то есть подходящими символами являются те за которыми не следует определенная подстрока. Такая проверка делается, как вы правильно догадались, на основе заглядывания вперед. теперь собираем
. - произвольный символ
.(?!$tag) - произвольный символ, за которым не идет подстрока
(?:.(?!$tag)) - группировка для quantifier
(?:.(?!$tag))* - собственно искомая последовательность
((?:.(?!$tag))*) - искомая последовательность с захватом
P.S. Исходя из примеров могу предположить, что более широкой задачей является парсинг тегов. И похоже решать вы ее собрались неправильным способом, но он привел к задаче, которую интересно было решить :)
>P.S. Исходя из примеров могу предположить, что более широкой задачей является парсинг
>тегов. И похоже решать вы ее собрались неправильным способом, но
>он привел к задаче, которую интересно было решить :)Спасибо тебе. вообще давно хотелось сделать модуль один - некий smarttag, который позволял бы объектными методами работать с парсингом темплейтов и заменять в них какие то данные на то что хотелось бы пользователю.
Это могли быть любые теги, например список пользователей или список комнат на чате со вложенным списком пользователей, у которых еще есть вложеный список флагов.
Притом сделать управление обработки этих тегов максимально простым и чтобы программисту неприходилось задумываться о парсинге вообще.Реализация которую ты предложил работает, спасибо тебе огромное. Но идея действительно была немного неверна - так как она требует буфферизации. А я думаю никому не захочется буферизировать весь список пользователей или правил фаервола или чего там еще может быть.. потому я оставлю наработку как вариант но пойду другим путем - поступательного вывода.
Если будет интересно - выложу пожже рабочий модуль с описанием.regards, procool@