Скептичный циник
Миру - мир. А Вам - пломбир!
Доброго времени суток, сообщники!

Хотите немного ненормального программирования? :3 Нет, я не буду пытаться парсить html. Всё чуточку проще.

tl;dr: смотреть сюда, там понятны как регексп, так и задание плюс автоматически можно играться/проверять.

Подробнее.
Дано
Некоторый текст, в котором находится номер телефона в различных вариантах. Список:


Надо
Регекспами (PCRE) сматчить номер, но только в том случае, если он не московский и только если он не обёрнут в тег с определённым классом "foobar":


Упрощаем жизнь
Перед номером может быть всего два кода (812 или 495) или никакого вообще (пустой
считать питерским).
Обёртка находится всегда вплотную (достаточно искать строку класса в теге перед номером).


Усложняем бытие
Код города (и только он) может быть обёрнут в пустой span и/или быть в скобках.


В чём проблема?
Отрицание для группы (?!495) работает странно даже в паттернах типа /((?!495).*)/gui – не матчит четвёрку, но строку с ней считает найденной. Отсюда два вопроса:
1. Как сделать так, чтобы регексп вообще пропустил всю строку, где есть 495?
2. Почему регексп отрицает только первую цифру 4, а не все остальные?
3. Общие пожелания для улучшения регекспа тоже принимаются.

Сам регексп можно посмотреть и автоматически затестить вот здесь.

Спасибо и have fun!

@настроение: o.0

@темы: regex, pcre, PHP, Computer Science, *nix