Регулярное выражение как указать исключение из результата

Всем привет. Суть такова есть регулярное выражение которое ищет все даты в тексте и делает их красными если за ними идет слово месяц допусти (30 января). как сделать что бы января не попадала в результат замены. То есть была в шаблоне поиска и искала все даты за которыми идет только месяц но в результе не учитывала месяц а выводил только дату перед месяцем. Как исключить из результата месяц что бы форматировать только дату. Вот код приблизительно:

```  $string=$_POST ["formText"];
//Подчеркиваем даты жирным кирпичным цветом
$pattern = '/\s+\d+\s*(январ|сентя|феврал|март|апрел|мая|июн|июл|август|сентяб|октяб|декабр).*?\s+/';
$replacement = '<strong style="color: darkred; font-weight: bold">$0</strong>';
$resultData=preg_replace($pattern, $replacement, $string,-1);```

Данный код красным делает полностью 30 и января.


Ответы (2 шт):

Автор решения: Zombotron

Типа так:

$string = $_POST ["formText"];
$pattern = '/(\d{1,2})(\s*?)(январ|феврал|март|апрел|мая|июн|июл|август|сентяб|октяб|ноябр|декабр)(.*?)/i';
$replacement = '<strong style="color: darkred; font-weight: bold">$1</strong>$2$3$4';
$resultData=preg_replace($pattern, $replacement, $string);

https://onlinegdb.com/pZJN8eyzD

→ Ссылка
Автор решения: Егор Банин

Есть пара способов сделать это.

  1. Регулярки на PHP поддерживают утверждения.
\d{1,2}(?=\s*(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)(\W|$))

<b>$0</b>
  1. Можно использовать номера подмасок при подстановке.
(\d{1,2})(\s*(?:января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)(?:\W|$))

<b>$1</b>$2

Обратите внимание, что в вашей регулярке пропал ноябрь. Так же строка начинающаяся с числа и заканчивающаяся числом не будет сматчена (например: "14 сентября -- день государственного гимна США.", "В Никарагуа день победы отмечают 14 сентября.").

→ Ссылка