Регулярное выражение как указать исключение из результата
Всем привет. Суть такова есть регулярное выражение которое ищет все даты в тексте и делает их красными если за ними идет слово месяц допусти (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 шт):
Типа так:
$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);
Есть пара способов сделать это.
- Регулярки на PHP поддерживают утверждения.
\d{1,2}(?=\s*(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)(\W|$))
<b>$0</b>
- Можно использовать номера подмасок при подстановке.
(\d{1,2})(\s*(?:января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)(?:\W|$))
<b>$1</b>$2
Обратите внимание, что в вашей регулярке пропал ноябрь. Так же строка начинающаяся с числа и заканчивающаяся числом не будет сматчена (например: "14 сентября -- день государственного гимна США.", "В Никарагуа день победы отмечают 14 сентября.").