Замена регулярным выражением, но с одним исключением

Роберт

Аналитик
Замена регулярным выражением, но с одним исключением

Никак не могу придумать - может кто-то подскажет?
Надо пройтись по тексту и выделить все даты.
Тоесть , если в тексте есть "aaaaa 12.08.1999 sssss" надо заменть на "aaaaa <b>01.08.1999</b> sssss".
Задача вроде элементарная - составляю регулярное выражение , которое находит все даты (они ведь могут писаться с одной или двумя цифрами в дне и с четырмя или двумя цифрами в годе) , и дальке через preg_replace() меняю на туже дату , только обромлённую тегами <b>.
Но в задачу вкралось одно исключение - дата "10.10.2000" - НЕ ДОЛЖЖНА БЫТЬ ВЫДЕЛЕНА!
Есть ли какая-то возможность задать такое исключение? Или как-то проверять дополнительно самому после совпадения регулятного выражение но перед заменой?
У меня пока что есть только две идеи как это делать:
1) перед вышеописанной заменой вначале заменить 10.10.2000 на какой-нибудь 10--10--2000 , а после того как все даты будут выделены , заменть обратно 10--10--2000 на 10.10.2000.
2) Вначале меняю всё как и было описано ранее , а потом ищу по всему тексту <b>10.10.2000</b> и меняю его обратно на 10.10.2000.
Мне кажется - оба эти варианты очень неудобны. Может есть какая-то другая возможность?
 

SelenIT

IT-лунатик :)
Можно что-то наподобие
PHP:
preg_replace('~(?:1(?!0\.10\.2000)|[023])\d\.(?:0\d|1[0-2])\.(?:19|20)\d{2}~s', "<b>\\0</b>", $subj);
Но я бы пожалуй, выбрал вариант 2 - с обратной заменой...
 

.des.

Поставил пиво кому надо ;-)
2 SelenIT контрольый пример
"Days without leading zero 1.08.1999"
Самый простой вариант это preg_replace_callback. К тому же если сравнить его с lookahead negative assertions, думаю он еще и побыстрее будет, но это надо тестить :)
 

Роберт

Аналитик
.des.
Спасибо! Я помнил что что-то такое было (по этому и спросил про перехват) , но зайдя в описание preg_replace() внизу нашёл лишь строку:

Смотрите также preg_match(), preg_match_all(), и preg_split().

про калбэк там небыло написано...
Теперь проблем не будет! :)
 

.des.

Поставил пиво кому надо ;-)
Автор оригинала: Steamroller
Не будет. :)
Не будет что? :)
Собственно, задачи решаемые при помощи lookahead negative assertion и callback не являются идентичными. Или вы хотите сравнить не совсем верное решение предложенное выше с callback?
 
Сверху