есть такая регулярка: PHP: $pattern = '|(?<!<nospam>)<a(.*?)>(.*?)</a>(?!.*</nospam>)|i'; задача регулярки собрать все ссылки (теги А), кроме тех которые находятся между тегами <nospam></nospam> все бы ничего и можно было бы использовать негативный просмотр назад и вперед для случаев когда в тексте встречаются конструкции вида: HTML: <nospam><a href="http://url">ccылка</a></nospam> но вот если внутри тегов <nospam></nospam> кроме ссылки лежат другие теги к примеру HTML: <nospam><p><a href="http://url">ccылка 1</a></p><table><tr><td><a href="http://url">ccылка 2</a></td></tr></table></nospam> то данная конструкция забирает первую ссылку.. если регулярку изменить до такого вида $pattern = '|(?<!<nospam>.*)<a(.*?)>(.*?)</a>(?!.*</nospam>)|i'; получаю в ответ: Warning: preg_replace_callback() [function.preg-replace-callback]: Compilation failed: lookbehind assertion is not fixed length at offset ... кусок регулярки (?<!<nospam>.*) - трактуемый как негативный просмотр назад с сопоставление тега <nospam> и любого кол-ва символов до встрети тега <a вызывает ошибку Может кто-то сталкивался с подобным? или же просто поделится опытом и знаниями )
Рискну предположить что нелогично так использовать просмотры (позитивный, негативный, вперед или назад). Цитата из википедии Специализация у них как бе другая. Я бы сначала попробовал что-нибудь типо .{,3}, но подозреваю что assertion is not fixed length намекает на то что нужна именно фиксированная длина. А после этого разбил задачу на 2 этапа - отдельно достал <nospam>.*?href="([^\"]).*?</nospam> и выкинул их из дальнейшей обработки, наверняка полученный ссылки где-то дальше крутятся в цикле