Если будет полезно, писал недавно код для склонения существительных прилагательных. Но требуется, что бы на вход подавалось слово в своей начальной форме.
Код: Выделить всё
/*
Функция склонения существительных
получает строку с существительным (в имен падеже), род существительного, падеж в который следует
преобразовать слово
gender = 1 Муж род
2 Жен род
3 Ср род
case = 1 Имен
2 Род
3 Дат
4 Винит
5 Творит
6 Предл
*/
function lang_decline_noun($str='',$gender=0,$case=0){
$str = trim($str);
if ($str=='' || !$gender || $case<1 || $case>6) return '';
if ($case==1) return $str;
$strl = strtolower($str); // переводим строку в нижний регистр (для удобства проверок)
$decl = 0; // склонение
$spec = 0; // специальное (слова исключения)
// Определение склонения
if ( ($gender==1 || $gender==2) && in_array(substr($strl,-1),array('а','я')) ){ // Жен или муж род, на -а или -я
$decl = 1; // 1е склонение
}elseif ( $gender==3 && in_array(substr($strl,-1),array('о','е')) ){ // Ср. род, на -о или -е
$decl = 2; // 2е склонение
}elseif( $gender==1 && lang_check_noun_zero_ending($str) ){ // Муж род, нулевое окончание
$decl = 2; // 2е склонение
}elseif( $gender==2 && lang_check_noun_zero_ending($str) ){ // Жен род, нулевое окончание
$decl = 3; // 3е склонение
}
if(!$decl) return $str;
// Определение является ли слово - исключением
if($decl==1 && substr($strl,-2)=='ия') $spec=1;
if($decl==2 && in_array(substr($strl,-2),array('ий','ие')) ) $spec=1;
// склонение
switch($decl){
case 1: // 1е склонение
$last = substr($strl,-1); // Получаем последний символ
$str = substr($str,0,-1); // Укорачиваем строку на 1 символ
$ending['а'] = array('','','ы','е','у','ой','е'); // массив окончаний
$ending['я'] = array('','','и','е','ю','ей','е');
if( $spec && ($case==3 || $case==6) ) $str.='и';
elseif( $case==5 && in_array(substr($str,-1),array('ж','ш','Ж','Ш')) ) $str.='ей';
else $str.=$ending[$last][$case];
break;
case 2: // 2е склонение
$last = substr($strl,-1); // Получаем последний символ
if($gender==3){ // Ср род, на -о, -е
$str = substr($str,0,-1); // Укорачиваем строку на 1 символ
$ending['о'] = array('','','а','у','о','ом','е'); // массив окончаний
$ending['е'] = array('','','я','ю','е','ем','и');
if($case==6 && lang_check_noun_zero_ending($str)) $str.='е';
else $str.=$ending[$last][$case];
}else{ // Муж род
if($last=='ь' || $last=='й'){
$str = substr($str,0,-1); // Укорачиваем строку на 1 символ
$ending = array('','','я','ю','я','ем','е'); // массив окончаний
if($spec && $case==6) $str.='и';
else $str.=$ending[$case];
}else{
$ending = array('','','а','у','','ом','е');
$str.=$ending[$case];
}
}
break;
case 3: // 3е склонение
$str = substr($str,0,-1); // Укорачиваем строку на 1 символ
$ending = array('','','и','и','ь','ью','и');
if(!in_array(substr($str,-1),array('ч','Ч','ш','Ш','ж','Ж')) && $case!=4) $str.='ер';
$str.=$ending[$case];
break;
}
// Проверка на жи, ши
if( substr($str,-1)=='ы' && in_array(substr($str,-2,-1),array('ж','ш','Ж','Ш','ч','Ч')) ){ $str[strlen($str)-1]='и'; }
return $str;
}
/*
Функция склонения качественных и относительных прилагательных
Внимание!!! Притяжательные прилагательные склоняются подругому
получает строку с прилагательным (в имен падеже), и падеж в который следует преобразовать слово
case = 1 Имен
2 Род
3 Дат
4 Винит
5 Творит
6 Предл
*/
function lang_decline_adjective($str='',$case=0){
$str = trim($str);
if ($str=='' || $case<1 || $case>6) return '';
if ($case==1) return $str;
$strl = strtolower($str); // переводим строку в нижний регистр (для удобства проверок)
switch(substr($strl,-2)){ // Определяем по окончанию род
case 'ый': $ending = array(1,'ый','ого','ому','ый','ым','ом'); break; // Мужской род
case 'ий': $ending = array(1,'ий','его','ему','ий','им','ем'); break;
case 'ое': $ending = array(2,'ое','ого','ому','ое','ым','ом'); break; // Средний род
case 'ее': $ending = array(2,'ее','его','ему','ее','им','ем'); break;
case 'ая': $ending = array(3,'ая','ой','ой','ую','ой','ой'); break; // Женский род
case 'яя': $ending = array(3,'яя','ей','ей','юю','ей','ей'); break;
default: return $str; // Не смогли определить род
}
$str = substr($str,0,-2).$ending[$case]; // Замена падежного окончания
return $str;
}
// Проверяет является ли окончание существительного в
// именительном падеже нулевым
function lang_check_noun_zero_ending($str=''){
$str = strtolower($str);
$ends = array('б','в','г','д','ж','з','й','к','л','м','н','п','р','с','т','ф','х','ц','ч','ш','щ','ь');
if (in_array(substr($str,-1),$ends)) return TRUE;
return FALSE;
}
Как показали тест-драйвы нормально работает на общеупотребительных словах, спотыкается на собственных именах и просто замечательно работает с ненормативной лексикой.