Сколько дней в русском языке?

Предыстория

Понадобилось вывести на сайте блок с обратным отсчетом до дня события. Средствами PHP находим разницу между текущей датой и датой мероприятия, а затем выводим фразу "Осталось N дней".

Получить эту цифру не составляет большого труда. Выводим её на экран вместе со словами. Так как основной язык сайта — английский, получаем такой вариант.

Блок с выводом обратного отсчета

В сложном для меня английском языке слово «день» может иметь две формы: day — если один день, и days — если число дней больше одного.

Предусматриваем в коде проверку: если число оставшихся дней больше одного — выводим после числа «days left...», если один — тогда только «Tomorow...», без числа.

Версия на русском языке

Для русского варианта той же надписи все немного сложнее. Число остается тем же самым, но слово «день» может иметь три формы, в зависимости от стоящего перед ним числа.

Например, осталось 20 дней, остался 21 день, осталось 22 дня.

День

Слово день используется, если число оканчивается на единицу. При этом предпоследняя цифра в числе не является единицей. Слово «осталось» в этом варианте используется в виде остался.

Например: остался 1 день, остался 21 день, остался 151 день, остался 1001 день.

Дня

Слово дня используется если число оканчивается на 2, 3 или 4. При этом предпоследняя цифра в числе не является единицей.

Например: осталось 2 дня, 3 дня, 24 дня, 162 дня, 1003 дня.

Дней

Слово дней используется во всех остальных случаях. Когда число оканчивается на 5, 6, 7, 8, 9, 0. Или в конце числа 11, 12, 13, 14 (предпоследняя цифра — единица).

Например: осталось 5 дней, 11 дней, 26 дней, 112 дней, 214 дней, 356 дней, 1000 дней, 1005 дней.

Проверка числа и вывод слова «день» на PHP

Для вывода слова «день» в правильной форме в зависимости от стоящего перед ним числа нам потребуется дополнительная проверка.

Можно, конечно извлекать подстроку из числа и проверять корректность с помощью многочисленных блоков if-else или использовать switch.

Но в нашем случае описание условий вывода слова идеально ложится в синтаксис регулярных выражений.

Строка содержит только 1 или символ 1 в конце строки и перед ним не стоит символ единица:

/^1$|[^1]1$/

Строка содержит только символ 2, 3 или 4; или символ 2, 3 или 4 в конце строки и перед ним не стоит символ единица:

/^(2|3|4)$|[^1](2|3|4)$/

Весь код проверки:

$daysleft = 'Осталось';
$days = ' дней...';
if (preg_match('/^1$|[^1]1$/', $countdown )) {
	$daysleft = 'Остался';
	$days = ' день...';
}
else
if(preg_match('/^(2|3|4)$|[^1](2|3|4)$/', $countdown )) {
$days = ' дня...';
}
/*Используем значения переменных $daysleft и $days для вывода*/	 

Поделится ссылкой: