Здравствуйте! У меня такая задача. В зависимости от числа, к нему подставляется одно из слов: год, года, лет. Например, 1 год, 2 года, 12 лет и так к любому числу. Для проверочки организовал все это в цикле. Но вот что-то составить корректное регулярное выражение не могу, хотя вроде задача не сложная. Некоторые числа комментирует некорректно. PHP: for($i=1;$i<=200;$i++) { if(preg_match("/[02-9]?(1)+$/",$i) && !preg_match("|(11)$|",$i)) { $comment='год'; } elseif(preg_match("/[\d]?(2|3|4)+$/",$i)) { $comment='года'; } else { $comment='лет'; } echo $i.' '.$comment.'<br>'; }
В русском языке существует три варианта окончания для чисел. Закономерность: если число заканчивается заканчивается на 1, то одна форма; если на 2, 3 или 4, то другая; в противном случае - третья. Исключение составляют числа 11, 12, 13 и 14: они всегда имеют третью форму окончания (или слова целиком). PHP: <?php function ending($num, $first, $second, $third) { $num = (int)$num; if ($num < 21 && $num > 4) return $third; $num = $num%10; if ($num == 1) return $first; if ($num > 1 && $num < 5) return $second; return $third; } ?>
Ну и мой вариант: PHP: <?php for($i=1;$i<=200;$i++) { echo yaer_format($i)."<br>"; } function yaer_format($i) { ereg("..$",$i,$t); $s=$t[0]; if ($s>=5 && $s<=20) { $res = $i." лет"; } else { ereg(".$",$i,$t); $s=$t[0]; if ($s=="1") {$res = $i." год";} elseif (in_array($s,Array("2","3","4"))) {$res = $i." года";} else {$res = $i." лет";} } return $res; } ?>
Реализовал вот так. Работает правильно. PHP: <?php for($i=1;$i<=200;$i++) { // Если число заканчивается на 1 if(preg_match("|(1)$|",$i)) { $comment='год'; } // Если число заканчивается на 2,3,4 elseif(preg_match("/(2|3|4)$/",$i)) { $comment='года'; } else { $comment='лет'; } // Если заканчивается на 10-19 if(preg_match("/(1)[0-9]$/",$i)) { $comment='лет'; } echo $i.' '.$comment.'<br>'; } ?>
Тогда так: PHP: <?php function ending($num, $first, $second, $third) { $num = $num%100; if ($num < 21 && $num > 4) return $third; $num = $num%10; if ($num == 1) return $first; if ($num > 1 && $num < 5) return $second; return $third; } ?>
PHP: <?php function _decl( $numb, $one, $double, $multy ){ $d1= $numb % 10; $d2= ( $numb / 10 ) % 10; if( $d2 != 1 ){ if(( $d1 > 1 )&&( $d1 < 5 )) return $double; if( $d1 == 1 ) return $one; } return $multy; } ?>
Немного не то 8) Но вариант, который недавно написал для используемых случаев на странице. PHP: <?php function ender($slovo, $number, $type) { //Типы: сингл - 1 тип (сингл, синглов, сингла), композиц -2 тип (композиция/ии/ий) $types = array (1 => array ('', 'а', 'ов'), 2 => array('ия', 'ии', 'ий')); $number = (int)$number; $sub1 = substr($number, -1); $sub2 = substr($number, -2); if ($sub1 == 1 and $sub2 != 11) { return $slovo.$types[$type][0]; } elseif (($sub1== 2 or $sub1== 3 or $sub1== 4) && ($sub2 != 12 and $sub2 != 13 and $sub2 != 14)) { return $slovo.$types[$type][1]; } else { return $slovo.$types[$type][2]; } } ?>
PHP: <? # склоняем по падежам function OOPSSpell($num, $base, $endings) { if ($num % 100 >= 11 && $num % 100 <= 19) { return $base . $endings[2]; } else { switch ($num % 10) { case 1: return $base . $endings[0]; case 2: case 3: case 4: return $base . $endings[1]; default: return $base . $endings[2]; } } } ?> PHP: <? print OOPSSpell(42,'жоп',array('а','ы','')); ?>
Kreker не. это числительные. =) это я просто такой неграмотный... а по падежам надо по другому склонять