Регулярное выражение preg_match

Рейтинг: 0Ответов: 2Опубликовано: 25.02.2015

Добрый день.

У меня на сайте в новостях есть такие данные. Название разное, а смысл тот же. Сейчас переношу все отдельно по полям в базу данных и не могу никак выловить текст (вот такое) регулярным выражением:

Год: 2014<br />
год: 2014<br />
год выхода: 2013-2014<br />
Год выхода: 2013-2014<br />

Пытаюсь вот так:

'year' => '#(Год\|год).*?:(.+?)<br />#si',

Ничего не получается. Как все-таки правильно выловить значение после :?

Ответы

▲ 1Принят
$content = 
"Год: 2014<br />
год: 2015<br />
год выхода: 2013-2014<br />
Год выхода: 2013-2014<br />";

if (preg_match_all('/год:\s*(?P<year>\d{4})/iu', $content, $matches)) {
  var_dump($matches["year"]);
}

Смотрите результат

Обновление

Вариант с диапазоном

$content =
    "Год: 2014<br />
год: 2015<br />
рейтинг: 9999<br />
год выхода: 2013-2014<br />
качество: хорошо<br />
Год выхода: 2014-2015<br />";

if (preg_match_all('/год[^:]*?:\s*(?P<year>\d{4}(?:\-\d{4})?)/iu', $content, $matches)) {
    var_dump($matches['year']);
}

Смотрите результат

▲ 1

\| - так вы заэкранировали спецсимвол.
Вместо Год или год у вас ищется прямым текстом Год\|год.
Конечно же, совпадений нет.

Вот вам улучшенное регулярное выражение:

#год[^:]*?:\s*(\d{4}(?:\-\d{4})?)<br \/>#siu

iu - благодаря этим флагам у вас регистронезависимая регулярка
год[^:]*?: - год в любом регистре, затем максимально короткая последовательность любых символов, кроме двоеточия, потом двоеточие
\s* - произвольная по длине последовательность пробельных символов
(\d{4}(?:\-\d{4})?) - либо 4-х значное число, либо 4-х значное число, дефис и еще одно 4-х значное число. ?: указывает на то, что группу в скобках не нужно запоминать.

Посмотреть пример работы