Класс позволяющий склонять русские фамилии по падежам

Тема в разделе 'Библиотеки, классы', создана пользователем Admin, 9 май 2011.

  1. Admin Админ

    Название: NameCaseLib
    Описание: Библиотек для PHP5, которая позволяет склонять русские имена, фамилии и отчества по падежам.
    Автор: Андрей Чайка ***Для просмотра ссылок необходимо войти или зарегистрироваться***

    PHP:
    <?php

    /*
    * NCL NameCase Russian Language
    *
    * Класс, которые позволяет склонять русские Имена, Фамили Отчества по падежам.
    *
    * @license Dual licensed under the MIT or GPL Version 2 licenses.
    * @author Андрей Чайка http://seagull.net.ua/ bymer3@gmail.com
    * @version 0.1.2 05.05.2011
    *
    */

    class NCLNameCaseRu
    {
        
    /*
        * Имя для склонения
        * @var string
        */

        
    private $firstName "";
     
        
    /*
        * Фамилия для склонения
        * @var string
        */
        
    private $secondName "";
     
        
    /*
        * Отчество для склонения
        * @var string
        */
        
    private $fatherName "";
     
        
    /*
        * @var integer
        * Пол человека
        * <li>0 - не известно</li>
        * <li>1 - мужчина</li>
        * <li>2 - женщина</li>
        */
        
    private $gender 0;

        
    /*
        * @static integer
        */
        
    static $MAN 1;

        
    /*
        * @static integer
        */
        
    static $WOMAN 2;

        
    /*
        * @static integer
        * Падежи
        */
        
    static $IMENITLN 0;
        static 
    $RODITLN 1;
        static 
    $DATELN 2;
        static 
    $VINITELN 3;
        static 
    $TVORITELN 4;
        static 
    $PREDLOGN 5;

        
    /*
        * @static string
        * Список гласных
        */
        
    private $vowels "аеёиоуыэюя";

        
    /*
        * @static string
        * Список согласных
        */
        
    private $consonant "бвгджзйклмнпрстфхцчшщ";
     
        
    /*
        * @static array()
        * Список окончание для неизменяемых имен
        */
        
    private $ovo = array('ово''аго''яго''ирь');

        
    /*
        * @static array()
        * Список окончание для неизменяемых имен
        */
        
    private $ih = array('их''ых''ко');

        
    /*
        * @var array()
        * Результат склонения имени
        */
        
    private $firstResult = array();
     
        
    /*
        * @var array()
        * Результат склонения фамилии
        */
        
    private $secondResult = array();

        
    /*
        * @var array()
        * Результат склонения отчества
        */
        
    private $fatherResult = array();

        
    /*
        * @var integer
        * Номер правила по которому не склоняется имя/фамилия
        */
        
    private $error "";

        
    /*
        * @var integer
        * Номер правила по которому склоняется имя
        */
        
    private $frule "";

        
    /*
        * @var integer
        * Номер правила по которому не склоняется фамилия
        */
        
    private $srule "";

        
    /*
        * Функция, которая склоняет имя записаное в $this->firstName, по правилам склонения мужских имен.
        *
        * @return boolean
        */

        
    private function manFirstName()
        {
            
    //Последний символ
            
    $LastSymbol mb_substr($this->firstName, -11'utf-8');
            
    //Предпоследний символ
            
    $BeforeLast mb_substr($this->firstName, -21'utf-8');
            
    $needToChange true;
            
    $this->firstResult = array();
            
    //Не склоняются
            //Мужские и женские имена, оканчивающиеся на гласный звук исключая -а, -я
            
    if ($this->in($LastSymbol$this->vowels) and !$this->in($LastSymbol'ая'))
            {
                
    $needToChange false;
                
    $this->error 3;
            }
            
    //Если нужно склонять
            
    if ($needToChange)
            {
                
    //Мужские имена, оканчивающиеся на любой согласный (твердый или мягкий) и на -й, скло­няются так же, как обычные существительные мужского рода
                
    if ($this->in($LastSymbol$this->consonant) or
                        (
    $LastSymbol == "ь" and $this->in($BeforeLast$this->consonant)))
                {
                    
    //если на й или ь
                    
    if ($this->in($LastSymbol'ьй'))
                    {
                        if (
    $BeforeLast <> "и")
                        {
                            
    $this->firstResult $this->padeg($this->firstName, array('я''ю''я''ем''е'), true);
                            
    $this->frule 1;
                            return 
    true;
                        }
                        else
                        {
                            
    $this->firstResult $this->padeg($this->firstName, array('я''ю''я''ем''и'), true);
                            
    $this->frule 10;
                            return 
    true;
                        }
                    }
                    else
                    {
                        if (
    $this->firstName == "Павел")
                        {
                            
    $this->firstResult = array("Павел""Павла""Павлу""Павла""Павлом""Павле");
                            
    $this->frule 200;
                            return 
    true;
                        }
                        elseif (
    $this->firstName == "Лев")
                        {
                            
    $this->firstResult = array("Лев""Льва""Льву""Льва""Львом""Льве");
                            
    $this->frule 201;
                            return 
    true;
                        }
                        else
                        {
                            
    $this->firstResult $this->padeg($this->firstName, array('а''у''а''ом''е'), false);
                            
    $this->frule 2;
                            return 
    true;
                        }
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся на -а, склоняются, как и любые существительные с таким же окончанием
                
    elseif ($LastSymbol == "а")
                {
                    if (
    $BeforeLast <> 'к')
                    {
                        
    $this->firstResult $this->padeg($this->firstName, array('ы''е''у''ой''е'), true);
                        
    $this->frule 3;
                        return 
    true;
                    }
                    else
                    {
                        
    $this->firstResult $this->padeg($this->firstName, array('и''е''у''ой''е'), true);
                        
    $this->frule 15;
                        return 
    true;
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся иа -я, -ья, -ия, -ея, независимо от языка, из которого они происходят, склоняются как сущест­вительные с соответствующими окончаниями
                
    elseif ($LastSymbol == "я")
                {
                    
    $this->firstResult $this->padeg($this->firstName, array('и''е''ю''ей''е'), true);
                    
    $this->frule 4;
                    return 
    true;
                }
            }

            
    //Если правило не нашли, тогда оставляем как было
            
    if (!isset($this->firstResult[0]))
            {
                
    $this->makeFirstTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая склоняет имя записаное в $this->firstName, по правилам склонения женских имен.
        *
        * @return boolean
        */

        
    private function womanFirstName()
        {
            
    //Последний символ
            
    $LastSymbol mb_substr($this->firstName, -11'utf-8');
            
    //Предпоследний символ
            
    $BeforeLast mb_substr($this->firstName, -21'utf-8');
            
    $needToChange true;
            
    $this->firstResult = array();
            
    //Не склоняются
            //Женские имена, оканчивающиеся на согласный звук
            
    if ($this->in($LastSymbol$this->consonant))
            {
                
    $needToChange false;
                
    $this->error 2;
            }
            
    //Мужские и женские имена, оканчивающиеся на гласный звук исключая -а, -я
            
    if ($this->in($LastSymbol$this->vowels) and !$this->in($LastSymbol'ая'))
            {
                
    $needToChange false;
                
    $this->error 3;
            }
            
    //Если нужно склонять
            
    if ($needToChange)
            {
                
    //Мужские и женские имена, оканчивающиеся на -а, склоняются, как и любые существительные с таким же окончанием
                
    if ($LastSymbol == "а")
                {
                    if (!
    $this->in($BeforeLast'шхкг'))
                    {
                        
    $this->firstResult $this->padeg($this->firstName, array('ы''е''у''ой''е'), true);
                        
    $this->frule 3;
                        return 
    true;
                    }
                    else
                    {
                        
    //ей посля шиплячего
                        
    if ($BeforeLast == 'ш')
                        {
                            
    $this->firstResult $this->padeg($this->firstName, array('и''е''у''ей''е'), true);
                            
    $this->frule 25;
                            return 
    true;
                        }
                        else
                        {
                            
    $this->firstResult $this->padeg($this->firstName, array('и''е''у''ой''е'), true);
                            
    $this->frule 15;
                            return 
    true;
                        }
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся иа -я, -ья, -ия, -ея, независимо от языка, из которого они происходят, склоняются как сущест­вительные с соответствующими окончаниями
                
    elseif ($LastSymbol == "я")
                {
                    if (
    $BeforeLast <> "и")
                    {
                        
    $this->firstResult $this->padeg($this->firstName, array('и''е''ю''ей''е'), true);
                        
    $this->frule 5;
                        return 
    true;
                    }
                    else
                    {
                        
    $this->firstResult $this->padeg($this->firstName, array('и''и''ю''ей''и'), true);
                        
    $this->frule 8;
                        return 
    true;
                    }
                }
                
    //Русские женские имена, оканчивающиеся на мягкий согласный, склоняются, как существительные женского рода типа дочь, тень
                
    elseif ($LastSymbol == "ь")
                {
                    
    $this->firstResult $this->padeg($this->firstName, array('и''и''ь''ью''и'), true);
                    
    $this->frule 6;
                    return 
    true;
                }
            }
            
    //Если правило не нашли, тогда оставляем как было
            
    if (!isset($this->firstResult[0]))
            {
                
    $this->makeFirstTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая склоняет фамилию записаное в $this->secondName, по правилам склонения мужских фамилий.
        *
        * @return boolean
        */

        
    private function manSecondName()
        {
            
    //Последний символ
            
    $LastSymbol mb_substr($this->secondName, -11'utf-8');
            
    //Предпоследний символ
            
    $BeforeLast mb_substr($this->secondName, -21'utf-8');
            
    $needToChange true;
            
    $this->secondResult = array();
            
    //Не склоняются
            //Фамилии на -а, -я с предшествующим гласным -и
            
    if ($this->in($LastSymbol'ая') and $BeforeLast == "и")
            {
                
    $needToChange false;
                
    $this->error 4;
            }
            
    /* Русские фамилии, представляющие собой застывшие формы родительного падежа единственного числа с окончаниями: -ово, -аго, -яго (Дурново, Сухово, Живаго, Шамбинаго, Дебяго, Хитрово) и множественного числа с окончаниями: -их, -ых (Крученых, Островских, Польских, Долгих, Седых),  + украинские на ко */
            
    if (in_array(mb_substr($this->secondName, -33'utf-8'), $this->ovo) or in_array(mb_substr($this->secondName, -22'utf-8'), $this->ih))
            {
                
    $needToChange false;
                
    $this->error 5;
            }
            
    //Если нужно склонять
            
    if ($needToChange)
            {
                
    //Мужские фамилии, оканчивающиеся на любой согласный (твердый или мягкий) и на -й, скло­няются так же, как обычные существительные мужского рода
                
    if ($this->in($LastSymbol$this->consonant) or
                        (
    $LastSymbol == "ь" and $this->in($BeforeLast$this->consonant)))
                {
                    
    //если на й или ь
                    
    if ($this->in($LastSymbol'ьй'))
                    {

                        if ((
    mb_substr($this->secondName, -31'utf-8') == "а") or $BeforeLast == 'е')
                        {
                            
    $this->srule 101;
                            
    $this->secondResult $this->padeg($this->secondName, array('я''ю''я''ем''е'), true);
                            return 
    true;
                        }
                        
    //Толстой -» ТолстЫм
                        
    elseif ($BeforeLast == 'ы' or mb_substr($this->secondName, -31'utf-8') == 'т')
                        {
                            
    $this->secondResult $this->padeg($this->secondName, array('ого''ому''ого''ым''ом'), truetrue);
                            
    $this->srule 102;
                            return 
    true;
                        }
                        
    //Лесничий
                        
    elseif ((mb_substr($this->secondName, -33'utf-8')) == 'чий')
                        {
                            
    $this->secondResult $this->padeg($this->secondName, array('ьего''ьему''ьего''ьим''ьем'), truetrue);
                            
    $this->srule 103;
                            return 
    true;
                        }
                        else
                        {
                            
    $this->secondResult $this->padeg($this->secondName, array('ого''ому''ого''им''ом'), truetrue);
                            
    $this->srule 1;
                            return 
    true;
                        }
                    }
                    else
                    {
                        
    //Если предпоследняя к, то нужно ом вместо ым
                        
    if ($this->in($LastSymbol'к'))
                        {
                            
    //Если перед слово на ок, то нужно убрать о
                            
    if ($this->in($BeforeLast'о'))
                            {
                                
    $this->secondResult $this->padeg($this->secondName, array('ка''ку''ка''ком''ке'), falsetrue);
                                
    $this->srule 2301;
                                return 
    true;
                            }
                            if (
    $this->in($BeforeLast'е'))
                            {
                                
    $this->secondResult $this->padeg($this->secondName, array('ька''ьку''ька''ьком''ьке'), falsetrue);
                                
    $this->srule 2302;
                                return 
    true;
                            }
                            else
                            {
                                
    $this->secondResult $this->padeg($this->secondName, array('а''у''а''ом''е'), false);
                                
    $this->srule 23;
                                return 
    true;
                            }
                        }
                        else
                        {
                            
    //Если основа на ч, то нужно ем
                            
    if ($LastSymbol == 'ч')
                            {
                                
    $this->secondResult $this->padeg($this->secondName, array('а''у''а''ем''е'), false);
                                
    $this->srule 301;
                                return 
    true;
                            }
                            else
                            {
                                
    $this->secondResult $this->padeg($this->secondName, array('а''у''а''ым''е'), false);
                                
    $this->srule 3;
                                return 
    true;
                            }
                        }
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся на -а, склоняются, как и любые существительные с таким же окончанием
                
    elseif ($LastSymbol == "а")
                {
                    
    //Если основа на ш, то нужно и, ей
                    
    if ($this->in($BeforeLast'ш'))
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('и''е''у''ей''е'), true);
                        
    $this->srule 401;
                        return 
    true;
                    }
                    elseif (
    $this->in($BeforeLast'хк'))
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('и''е''у''ой''е'), true);
                        
    $this->srule 402;
                        return 
    true;
                    }
                    else
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('ы''е''у''ой''е'), true);
                        
    $this->srule 4;
                        return 
    true;
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся иа -я, -ья, -ия, -ея, независимо от языка, из которого они происходят, склоняются как сущест­вительные с соответствующими окончаниями
                
    elseif ($LastSymbol == "я")
                {
                    
    $this->secondResult $this->padeg($this->secondName, array('ой''ой''ую''ой''ой'), truetrue);
                    
    $this->srule 6;
                    return 
    true;
                }
            }
            
    //Если правило не нашли, тогда оставляем как было
            
    if (!isset($this->secondResult[0]))
            {
                
    $this->makeSecondTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая склоняет фамилию записаное в $this->secondName, по правилам склонения женских фамилий.
        *
        * @return boolean
        */

        
    private function womanSecondName()
        {
            
    //Последний символ
            
    $LastSymbol mb_substr($this->secondName, -11'utf-8');
            
    //Предпоследний символ
            
    $BeforeLast mb_substr($this->secondName, -21'utf-8');
            
    $needToChange true;
            
    $this->secondResult = array();
            
    //Не склоняются
            //Женские фамилии, оканчивающиеся на согласный звук и мягкий знак
            
    if ($this->in($LastSymbol$this->consonant) or $LastSymbol == 'ь')
            {
                
    $needToChange false;
                
    $this->error 1;
            }
            
    //Фамилии на -а, -я с предшествующим гласным -и
            
    if ($this->in($LastSymbol'ая') and $BeforeLast == "и")
            {
                
    $needToChange false;
                
    $this->error 4;
            }
            
    /* Русские фамилии, представляющие собой застывшие формы родительного падежа единственного числа с окончаниями: -ово, -аго, -яго (Дурново, Сухово, Живаго, Шамбинаго, Дебяго, Хитрово) и множественного числа с окончаниями: -их, -ых (Крученых, Островских, Польских, Долгих, Седых),  + украинские на ко */
            
    if (in_array(mb_substr($this->secondName, -33'utf-8'), $this->ovo) or in_array(mb_substr($this->secondName, -22'utf-8'), $this->ih))
            {
                
    $needToChange false;
                
    $this->error 5;
            }
            
    //Если нужно склонять
            
    if ($needToChange)
            {
                
    //Мужские и женские имена, оканчивающиеся на -а, склоняются, как и любые существительные с таким же окончанием
                
    if ($LastSymbol == "а")
                {
                    if (
    $this->in($BeforeLast'гк'))
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('и''е''у''ой''е'), true);
                        
    $this->srule 501;
                        return 
    true;
                    }
                    elseif (
    $this->in($BeforeLast'ш'))
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('и''е''у''ей''е'), true);
                        
    $this->srule 502;
                        return 
    true;
                    }
                    else
                    {
                        
    $this->secondResult $this->padeg($this->secondName, array('ой''ой''у''ой''ой'), true);
                        
    $this->srule 5;
                        return 
    true;
                    }
                }
                
    //Мужские и женские имена, оканчивающиеся иа -я, -ья, -ия, -ея, независимо от языка, из которого они происходят, склоняются как сущест­вительные с соответствующими окончаниями
                
    elseif ($LastSymbol == "я")
                {
                    
    $this->secondResult $this->padeg($this->secondName, array('ой''ой''ую''ой''ой'), truetrue);
                    
    $this->srule 6;
                    return 
    true;
                }
            }

            
    //Если правило не нашли, тогда оставляем как было
            
    if (!isset($this->secondResult[0]))
            {
                
    $this->makeSecondTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая склоняет отчество записаное в $this->secondName, по правилам склонения мужских отчеств.
        *
        * @return boolean
        */

        
    private function manFatherName()
        {
            
    //Проверяем действительно ли отчество
            
    if ($this->fatherName == 'Ильич')
            {
                
    $this->fatherResult $this->padeg($this->fatherName, array('а''у''а''ом''е'), falsefalse);
                return 
    true;
            }
            elseif (
    mb_substr($this->fatherName, -22'utf-8') == 'ич')
            {
                
    $this->fatherResult $this->padeg($this->fatherName, array('а''у''а''ем''е'), falsefalse);
                return 
    true;
            }
            else
            {
                
    $this->makeFatherTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая склоняет отчество записаное в $this->fatherName, по правилам склонения женских отчеств.
        *
        * @return boolean
        */

        
    private function womanFatherName()
        {
            
    //Проверяем действительно ли отчество
            
    if (mb_substr($this->fatherName, -22'utf-8') == 'на')
            {
                
    $this->fatherResult $this->padeg($this->fatherName, array('ы''е''у''ой''е'), truefalse);
                return 
    true;
            }
            else
            {
                
    $this->makeFatherTheSame();
                return 
    false;
            }
        }

        
    /*
        * Функция, которая ставит имя во всех падежах в форме именительного падежа.
        *
        * @return void
        */

        
    private function makeFirstTheSame()
        {
            
    $this->firstResult array_fill(06$this->firstName);
        }

        
    /*
        * Функция, которая ставит фамилию во всех падежах в форме именительного падежа.
        *
        * @return void
        */

        
    private function makeSecondTheSame()
        {
            
    $this->secondResult array_fill(06$this->secondName);
        }

        
    /*
        * Функция, которая ставит фамилию во всех падежах в форме именительного падежа.
        *
        * @return void
        */

        
    private function makeFatherTheSame()
        {
            
    $this->fatherResult array_fill(06$this->fatherName);
        }

        
    /*
        * Функция проверяет, входит ли буква в строку.
        *
        * @param $letter - буква
        * @param $string - строка
        *
        * @return boolean
        */

        
    private function in($letter$string)
        {

            if (
    $letter and mb_strpos($string$letter) === false)
            {
                return 
    false;
            }
            else
            {
                return 
    true;
            }
        }

        
    /*
        * Функция дополняет переданое слово нужными окончаниями.
        *
        * @param $word (string) - слово
        * @param $endings (array) - окончания
        * @param $replaceLast (boolean) - убрать последнюю букву
        * @param $replaceTwoLast (boolean) - убрать две последних буквы
        *
        * @return boolean
        */

        
    private function padeg($word$endings$replaceLast=false$replaceTwoLast=false)
        {
            
    $result = array($word);
            if (
    $replaceTwoLast == true)
            {
                
    //убираем последнею букву
                
    $word mb_substr($word0mb_strlen($word'utf-8') - 2'utf-8');
            }
            elseif (
    $replaceLast == true)
            {
                
    //убираем последнею букву
                
    $word mb_substr($word0mb_strlen($word'utf-8') - 1'utf-8');
            }
            
    $i 0;
            for (
    $i == 0$i 5$i++)
            {
                
    $result[$i 1] = $word $endings[$i];
            }
            return 
    $result;
        }

        
    /*
        * Установка имени
        *
        * @param $firstname
        *
        * @return void
        */

        
    public function setFirstName($firstname="")
        {
            
    $this->firstName $firstname;
        }

        
    /*
        * Установка Фамилии
        *
        * @param $secondname
        *
        * @return void
        */

        
    public function setSecondName($secondname="")
        {
            
    $this->secondName $secondname;
        }

        
    /*
        * Установка Отчества
        *
        * @param $secondname
        *
        * @return void
        */

        
    public function setFatherName($fathername="")
        {
            
    $this->fatherName $fathername;
        }

        
    /*
        * Установка пола
        *
        * @param $gender
        * - null - не определено
        * - NCLNameCaseRu::$MAN - мужчина
        * - NCLNameCaseRu::$WOMAN - женщина
        * @return void
        */

        
    public function setGender($gender=0)
        {
            
    $this->gender $gender;
        }

        
    /*
        * Установка Имени, Фамилии, Отчества
        *
        * @param $firstName - имя
        * @param $secondName - фамилия
        * @param $fatherName - отчество
        *
        * @return void
        */

        
    public function setFullName($secondName=""$firstName=""$fatherName="")
        {
            
    $this->setFirstName($firstName);
            
    $this->setSecondName($secondName);
            
    $this->setFatherName($fatherName);
        }

        
    /*
        * Установка имени
        *
        * @param $firstname
        *
        * @return void
        */

        
    public function setName($firstname="")
        {
            
    $this->setFirstName($firstname);
        }

        
    /*
        * Установка Фамилии
        *
        * @param $secondname
        *
        * @return void
        */

        
    public function setLastName($secondname="")
        {
            
    $this->setSecondName($secondname);
        }

        
    /*
        * Установка Фамилии
        *
        * @param $secondname
        *
        * @return void
        */

        
    public function setSirname($secondname="")
        {
            
    $this->setSecondName($secondname);
        }

        
    /*
        * Автоматическое определение пола
        * @return void
        */

        
    private function genderDetect()
        {
            if (!
    $this->gender)
            {
                
    //Определение пола по отчеству
                
    if (isset($this->fatherName) and $this->fatherName)
                {
                    
    $LastTwo mb_substr($this->fatherName, -22'utf-8');
                    if (
    $LastTwo == 'ич')
                    {
                        
    $this->gender NCLNameCaseRu::$MAN// мужчина
                        
    return true;
                    }
                    if (
    $LastTwo == 'на')
                    {
                        
    $this->gender NCLNameCaseRu::$WOMAN// женщина
                        
    return true;
                    }
                }
                
    $man 0//Мужчина
                
    $woman 0//Женщина
                
    $FLastSymbol mb_substr($this->firstName, -11'utf-8');
                
    $FLastTwo mb_substr($this->firstName, -22'utf-8');
                
    $FLastThree mb_substr($this->firstName, -33'utf-8');
                
    $FLastFour mb_substr($this->firstName, -44'utf-8');

                
    $SLastSymbol mb_substr($this->secondName, -11'utf-8');
                
    $SLastTwo mb_substr($this->secondName, -22'utf-8');
                
    $SLastThree mb_substr($this->secondName, -33'utf-8');
                
    //Если нет отчества, то определяем по имени и фамилии, будем считать вероятность
                
    if (isset($this->firstName) and $this->firstName)
                {
                    
    //Попробуем выжать максимум из имени
                    //Если имя заканчивается на й, то скорее всего мужчина
                    
    if ($FLastSymbol == 'й')
                    {
                        
    $man+=0.9;
                    }
                    if (
    in_array($FLastTwo, array('он''ов''ав''ам''ол''ан''рд''мп')))
                    {
                        
    $man+=0.3;
                    }
                    if (
    $this->in($FLastSymbol$this->consonant))
                    {
                        
    $man+=0.01;
                    }
                    if (
    $FLastSymbol == 'ь')
                    {
                        
    $man+=0.02;
                    }

                    if (
    in_array($FLastTwo, array('вь''фь''ль')))
                    {
                        
    $woman+=0.1;
                    }

                    if (
    in_array($FLastTwo, array('ла')))
                    {
                        
    $woman+=0.04;
                    }

                    if (
    in_array($FLastTwo, array('то''ма')))
                    {
                        
    $man+=0.01;
                    }

                    if (
    in_array($FLastThree, array('лья''вва''ока''ука''ита')))
                    {
                        
    $man+=0.2;
                    }

                    if (
    in_array($FLastThree, array('има')))
                    {
                        
    $woman+=0.15;
                    }

                    if (
    in_array($FLastThree, array('лия''ния''сия''дра''лла''кла')))
                    {
                        
    $woman+=0.5;
                    }

                    if (
    in_array($FLastFour, array('льда''фира''нина''лита')))
                    {
                        
    $woman+=0.5;
                    }
                }
                if (isset(
    $this->secondName) and $this->secondName)
                {
                    if (
    in_array($SLastTwo, array('ов''ин''ев''ий''ёв''ый''ын''ой')))
                    {
                        
    $man+=0.4;
                    }

                    if (
    in_array($SLastThree, array('ова''ина''ева''ёва''ына''ая')))
                    {
                        
    $woman+=0.4;
                    }

                    if (
    in_array($SLastTwo, array('ая')))
                    {
                        
    $woman+=0.4;
                    }
                }
                
    //Теперь смотрим, кто больше набрал
                
    if ($man $woman)
                {
                    
    $this->gender NCLNameCaseRu::$MAN;
                }
                else
                {
                    
    $this->gender NCLNameCaseRu::$WOMAN;
                }
            }
        }

        
    /*
        * Автоматическое определение пола
        * Возвращает пол по ФИО
        * @return integer
        */

        
    public function genderAutoDetect()
        {
            
    $this->gender null;
            
    $this->genderDetect();
            return 
    $this->gender;
        }

        
    /*
        * Определение текущее слово есть фамилией, именем или отчеством
        * @return integer $number - 1-фамили 2-имя 3-отчество
        */

        
    private function detectNamePart($namepart)
        {
            
    $LastSymbol mb_substr($namepart, -11'utf-8');
            
    $LastTwo mb_substr($namepart, -22'utf-8');
            
    $LastThree mb_substr($namepart, -33'utf-8');
            
    $LastFour mb_substr($namepart, -44'utf-8');

            
    //Считаем вероятность
            
    $first 0;
            
    $second 0;
            
    $father 0;

            
    //если смахивает на отчество
            
    if (in_array($LastThree, array('вна''чна''вич''ьич')))
            {
                
    $father+=3;
            }

            
    //Похоже на имя
            
    if (in_array($LastThree, array('тин''тын')))
            {
                
    $first+=0.5;
            }

            
    //Исключения
            
    if (in_array($namepart, array('Лев''Яков''Мальвина''Антонина''Альбина''Агриппина''Каллиник''Маша''Ольга''Еремей''Фаина''Лазарь''Екатерина''Карина''Марина''Валентина''Кристина''Исак''Исаак''Валентин''Константин''Мартин''Устин''Калина''Аделина''Алина''Ангелина''Галина''Каролина''Павлина''Полина''Элина''Мина''Нина')))
            {
                
    $first+=10;
            }

            
    //похоже на фамилию
            
    if (in_array($LastTwo, array('ов''ин''ев''ёв''ый''ын''ой''ко''ук''як''ца''их''ик''ун''ок''ша''ая''га''ёк''аш''ив''юк''ус''це''ак''бр')))
            {
                
    $second+=0.4;
            }

            if (
    in_array($LastThree, array('ова''ева''ёва''ына''тых''рик''вач''аха''шен''мей''арь''вка''шир''бан''тин''чий''ина')))
            {
                
    $second+=0.4;
            }

            if (
    in_array($LastFour, array('ьник''нчук''тник''кирь''ский''шена')))
            {
                
    $second+=0.4;
            }
     
            
    $max max(array($first$second$father));

            if (
    $first == $max)
            {
                return 
    'N';
            }
            elseif (
    $second == $max)
            {
                return 
    'S';
            }
            else
            {
                return 
    'F';
            }
        }

        
    /*
        * Разбиение фразы на слова и определение, где имя, где фамилия, где отчество
        * @return string $format - формат имен и фамилий
        */

        
    public function splitFullName($fullname)
        {
            
    $this->firstName '';
            
    $this->secondName '';
            
    $this->fatherName '';
            
    $this->gender null;

            
    $fullname trim($fullname);
            
    $list explode(' '$fullname);
            
    $found = array();
            
    $duplicate = array();
            
    $c count($list);
            for (
    $i 0$i $c$i++)
            {
                if (
    trim($list[$i]))
                {
                    
    $found[$i] = $this->detectNamePart($list[$i]);
                }
            }
            
    $look = array('S' => false'F' => false'N' => false);
            
    //Первая пробежка - ищем дупликаты
            
    foreach ($found as $key => $letter)
            {
                if (
    $look[$letter]) //Если уже есть
                
    {
                    
    $duplicate[$key] = $letter;
                }
                else
                {
                    
    $look[$letter] = true;
                }
            }
            
    //Вторая пробежка - тасуем дупликаты
            
    foreach ($duplicate as $key => $letter)
            {
                if (!
    $look['S'])
                {
                    
    $found[$key] = 'S';
                }
                elseif (!
    $look['F'])
                {
                    
    $found[$key] = 'F';
                }
                elseif (!
    $look['N'])
                {
                    
    $found[$key] = 'N';
                }
                else
                {
                    
    $found[$key] = ''//4 слова одно игнорируем
                
    }
            }
            
    $format '';
            foreach (
    $found as $key => $letter)
            {
                if (
    $letter == 'S')
                {
                    
    $this->secondName $list[$key];
                }
                elseif (
    $letter == 'N')
                {
                    
    $this->firstName $list[$key];
                }
                elseif (
    $letter == 'F')
                {
                    
    $this->fatherName $list[$key];
                }
                
    $format.=$letter ' ';
            }
            return 
    trim($format);
        }

        
    /*
        * Склонение имени
        *
        * @return boolean
        */

        
    private function FirstName()
        {
            
    $this->genderDetect();
            if (
    $this->firstName)
            {
                if (
    $this->gender == 1)
                {
                    return 
    $this->manFirstName();
                }
                else
                {
                    return 
    $this->womanFirstName();
                }
            }
            else
            {
                
    $this->firstResult array_fill(06"");
                return 
    false;
            }
        }

        
    /*
        * Склонение фамилии
        *
        * @return boolean
        */

        
    private function SecondName()
        {
            
    $this->genderDetect();
            if (
    $this->secondName)
            {
                if (
    $this->gender == 1)
                {
                    return 
    $this->manSecondName();
                }
                else
                {
                    return 
    $this->womanSecondName();
                }
            }
            else
            {
                
    $this->secondResult array_fill(06"");
                return 
    false;
            }
        }

        
    /*
        * Склонение отчеств
        *
        * @return boolean
        */

        
    private function FatherName()
        {
            
    $this->genderDetect();
            if (
    $this->fatherName)
            {
                if (
    $this->gender == 1)
                {
                    return 
    $this->manFatherName();
                }
                else
                {
                    return 
    $this->womanFatherName();
                }
            }
            else
            {
                
    $this->fatherResult array_fill(06"");
                return 
    false;
            }
        }

        
    /*
        * Поставить имя в определенный падеж
        *
        * @return string
        */

        
    public function getFirstNameCase($number=null)
        {
            if (!isset(
    $this->firstResult[0]) or $this->firstResult[0] <> $this->firstName)
            {
                
    $this->FirstName();
            }
            if (
    $number or $number 5)
            {
                
    $number null;
            }

            if (
    is_null($number))
            {
                
    //Возвращаем все падежи
                
    return $this->firstResult;
            }
            else
            {
                return 
    $this->firstResult[$number];
            }
        }

        
    /*
        * Поставить фамилию в определенный падеж
        *
        * @return string
        */

        
    public function getSecondNameCase($number=null)
        {
            if (!isset(
    $this->secondResult[0]) or $this->secondResult[0] <> $this->secondName)
            {
                
    $this->SecondName();
            }
            if (
    $number or $number 5)
            {
                
    $number null;
            }

            if (
    is_null($number))
            {
                
    //Возвращаем все падежи
                
    return $this->secondResult;
            }
            else
            {
                return 
    $this->secondResult[$number];
            }
        }

        
    /*
        * Поставить отчество в определенный падеж
        *
        * @return string
        */

        
    public function getFatherNameCase($number=null)
        {
            if (!isset(
    $this->fatherResult[0]) or $this->fatherResult[0] <> $this->fatherName)
            {
                
    $this->FatherName();
            }
            if (
    $number or $number 5)
            {
                
    $number null;
            }

            if (
    is_null($number))
            {
                
    //Возвращаем все падежи
                
    return $this->fatherResult;
            }
            else
            {
                return 
    $this->fatherResult[$number];
            }
        }

        
    /*
        * Поставить фамилию в определенный падеж
        *
        * @return string
        */

        
    public function qFirstName($firstName$CaseNumber=null$gender=0)
        {
            
    $this->gender $gender;
            
    $this->firstName $firstName;
            return 
    $this->getFirstNameCase($CaseNumber);
        }

        
    /*
        * Поставить фамилию в определенный падеж
        *
        * @return string
        */

        
    public function qSecondName($secondName$CaseNumber=null$gender=0)
        {
            
    $this->gender $gender;
            
    $this->secondName $secondName;
            return 
    $this->getSecondNameCase($CaseNumber);
        }

        
    /*
        * Поставить отчество в определенный падеж
        *
        * @return string
        */

        
    public function qFatherName($fatherName$CaseNumber=null$gender=0)
        {
            
    $this->gender $gender;
            
    $this->fatherName $fatherName;
            return 
    $this->getFatherNameCase($CaseNumber);
        }

        
    /*
        * Склоняет во все падежи и форматирует по шаблону $format
        * Шаблон $format
        * S - Фамилия
        * N - Имя
        * F - Отчество
        *
        * @return array
        */

        
    public function getFormattedArray($format)
        {
            
    $length mb_strlen($format);
            
    $result = array();
            
    $cases=array();
            for (
    $i 0$i $length$i++)
            {
                
    $symbol mb_substr($format$i1);
                if (
    $symbol == 'S')
                {
                    
    $cases['S']=$this->getSecondNameCase();
                }
                elseif (
    $symbol == 'N')
                {
                    
    $cases['N']=$this->getFirstNameCase();
                }
                elseif (
    $symbol == 'F')
                {
                    
    $cases['F']=$this->getFatherNameCase();
                }
            }

            for (
    $curCase 0$curCase<6$curCase++)
            {
                
    $line="";
                for (
    $i 0$i $length$i++)
                {
                    
    $symbol mb_substr($format$i1);
                    if (
    $symbol == 'S')
                    {
                        
    $line.=$cases['S'][$curCase];
                    }
                    elseif (
    $symbol == 'N')
                    {
                        
    $line.=$cases['N'][$curCase];
                    }
                    elseif (
    $symbol == 'F')
                    {
                        
    $line.=$cases['F'][$curCase];
                    }
                    else
                    {
                        
    $line.=$symbol;
                    }
                }
                
    $result[]=$line;
            }
            return 
    $result;
        }

        
    /*
        * Склоняет в падеж $caseNum, и форматирует по шаблону $format
        * Шаблон $format
        * S - Фамилия
        * N - Имя
        * F - Отчество
        *
        * Например getFormatted(1, 'N F')
        * Выведет имя и отчество в родительном падиже
        *
        * @return string
        */

        
    public function getFormatted($caseNum=0$format="S N F")
        {
            if (
    is_null($caseNum))
            {
                return 
    $this->getFormattedArray($format);
            }
            else
            {
                
    $length mb_strlen($format);
                
    $result "";
                for (
    $i 0$i $length$i++)
                {
                    
    $symbol mb_substr($format$i1);
                    if (
    $symbol == 'S')
                    {
                        
    $result.=$this->getSecondNameCase($caseNum);
                    }
                    elseif (
    $symbol == 'N')
                    {
                        
    $result.=$this->getFirstNameCase($caseNum);
                    }
                    elseif (
    $symbol == 'F')
                    {
                        
    $result.=$this->getFatherNameCase($caseNum);
                    }
                    else
                    {
                        
    $result.=$symbol;
                    }
                }
                return 
    $result;
            }
        }

        
    /*
        * Склоняет фамилию имя отчество в падеж $caseNum, и форматирует по шаблону $format
        * Шаблон $format
        * S - Фамилия
        * N - Имя
        * F - Отчество
        *
        * @return string
        */

        
    public function qFullName($secondName=""$firstName=""$fatherName=""$gender=0$caseNum=0$format="S N F")
        {
            
    $this->gender $gender;
            
    $this->firstName $firstName;
            
    $this->secondName $secondName;
            
    $this->fatherName $fatherName;

            return 
    $this->getFormatted($caseNum$format);
        }

        public function 
    getFirstNameRule()
        {
            return 
    $this->frule;
        }

        public function 
    getSecondNameRule()
        {
            return 
    $this->srule;
        }

        
    /*
        * Быстрое склонение имени. Передается один параметр строка, где может быть ФИО в любом виде. Есть необязательный параметр пол. И так ще необязательный параметр падеж. Если падеж указан, тогда возвращается строка в том падеже, если нет тогда все возможные падежи.
        *
        * @return string
        */

        
    public function q($fullname$caseNum=null$gender=null)
        {
            
    $format $this->splitFullName($fullname);
            
    $this->gender $gender;
            
    $this->genderAutoDetect();
            return 
    $this->getFormatted($caseNum$format);
        }

    }

    ?>

    doroga_94 и XmP нравится это.
  2. XmP ADD ebx, 110h

    В некоторых случиях лучше не загружать сервер и воспользоваться Javascript:
    PHP:

    /**
     * Склонение русских имён и фамилий
     *
     * var rn = new RussianName('Паниковский Михаил Самуэльевич');
     * rn.fullName(rn.gcaseRod); // Паниковского Михаила Самуэльевича
     *
     * Список констант по падежам см. ниже в коде.
     *
     * Пожалуйста, присылайте свои уточнения мне на почту. Спасибо.
     *
     * @version  0.1.4
     * @author   Johnny Woo <agalkin@agalkin.ru>
     */

    var RussianNameProcessor = {
        
    sexM'm',
        
    sexF'f',
        
    gcaseIm:   'nominative',      gcaseNom'nominative',      // именительный
        
    gcaseRod:  'genitive',        gcaseGen'genitive',        // родительный
        
    gcaseDat:  'dative',                                       // дательный
        
    gcaseVin:  'accusative',      gcaseAcc'accusative',      // винительный
        
    gcaseTvor'instrumentative'gcaseIns'instrumentative'// творительный
        
    gcasePred'prepositional',   gcasePos'prepositional',   // предложный
        
        
    rules: {
            
    lastName: {
                
    exceptions: [
                    
    '    дюма,тома,дега,люка,ферма,гамарра,петипа,шандра . . . . .',
                    
    '    гусь,ремень,камень,онук,богода,нечипас,долгопалец,маненок,рева,кива . . . . .',
                    
    '    вий,сой,цой,хой -я -ю -я -ем -е'
                
    ],
                
    suffixes: [
                    
    'f    б,в,г,д,ж,з,й,к,л,м,н,п,р,с,т,ф,х,ц,ч,ш,щ,ъ,ь . . . . .',
                    
    'f    ска,цка  -ой -ой -ую -ой -ой',
                    
    'f    ая       --ой --ой --ую --ой --ой',
                    
    '    ская     --ой --ой --ую --ой --ой',
                    
    'f    на       -ой -ой -у -ой -ой',
                    
                    
    '    иной -я -ю -я -ем -е',
                    
    '    уй   -я -ю -я -ем -е',
                    
    '    ца   -ы -е -у -ей -е',
                        
                    
    '    рих  а у а ом е',
            
                    
    '    ия                      . . . . .',
                    
    '    иа,аа,оа,уа,ыа,еа,юа,эа . . . . .',
                    
    '    их,ых                   . . . . .',
                    
    '    о,е,э,и,ы,у,ю           . . . . .',
            
                    
    '    ова,ева            -ой -ой -у -ой -ой',
                    
    '    га,ка,ха,ча,ща,жа  -и -е -у -ой -е',
                    
    '    ца  -и -е -у -ей -е',
                    
    '    а   -ы -е -у -ой -е',
            
                    
    '    ь   -я -ю -я -ем -е',
            
                    
    '    ия  -и -и -ю -ей -и',
                    
    '    я   -и -е -ю -ей -е',
                    
    '    ей  -я -ю -я -ем -е',
            
                    
    '    ян,ан,йн   а у а ом е',
            
                    
    '    ынец,обец  --ца --цу --ца --цем --це',
                    
    '    онец,овец  --ца --цу --ца --цом --це',
            
                    
    '    ц,ч,ш,щ   а у а ем е',
            
                    
    '    ай  -я -ю -я -ем -е',
                    
    '    гой,кой  -го -му -го --им -м',
                    
    '    ой  -го -му -го --ым -м',
                    
    '    ах,ив   а у а ом е',
            
                    
    '    ший,щий,жий,ний  --его --ему --его -м --ем',
                    
    '    кий,ый   --ого --ому --ого -м --ом',
                    
    '    ий       -я -ю -я -ем -и',
                        
                    
    '    ок  --ка --ку --ка --ком --ке',
                    
    '    ец  --ца --цу --ца --цом --це',
                        
                    
    '    в,н   а у а ым е',
                    
    '    б,г,д,ж,з,к,л,м,п,р,с,т,ф,х   а у а ом е'
                
    ]
            },
            
    firstName: {
                
    exceptions: [
                    
    '    лев    --ьва --ьву --ьва --ьвом --ьве',
                    
    '    павел  --ла  --лу  --ла  --лом  --ле',
                    
    'm    шота   . . . . .',
                    
    'f    рашель,нинель,николь,габриэль,даниэль   . . . . .'
                
    ],
                
    suffixes: [
                    
    '    е,ё,и,о,у,ы,э,ю   . . . . .',
                    
    'f    б,в,г,д,ж,з,й,к,л,м,н,п,р,с,т,ф,х,ц,ч,ш,щ,ъ   . . . . .',

                    
    'f    ь   -и -и . ю -и',
                    
    'm    ь   -я -ю -я -ем -е',

                    
    '    га,ка,ха,ча,ща,жа  -и -е -у -ой -е',
                    
    '    а   -ы -е -у -ой -е',
                    
    '    ия  -и -и -ю -ей -и',
                    
    '    я   -и -е -ю -ей -е',
                    
    '    ей  -я -ю -я -ем -е',
                    
    '    ий  -я -ю -я -ем -и',
                    
    '    й   -я -ю -я -ем -е',
                    
    '    б,в,г,д,ж,з,к,л,м,н,п,р,с,т,ф,х,ц,ч     а у а ом е'
                
    ]
            },
            
    middleName: {
                
    suffixes: [
                    
    '    ич   а  у  а  ем  е',
                    
    '    на  -ы -е -у -ой -е'
                
    ]
            }
        },

        
    initializedfalse,
        
    init: function() {
            if(
    this.initialized) return;
            
    this.prepareRules();
            
    this.initialized true;
        },

        
    prepareRules: function() {
            for(var 
    type in this.rules) {
                for(var 
    key in this.rules[type]) {
                    for(var 
    0this.rules[type][key].lengthni++) {
                        
    this.rules[type][key][i] = this.rule(this.rules[type][key][i]);
                    }
                }
            }
        },

        
    rule: function(rule) {
            var 
    rule.match(/^\s*([fm]?)\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/);
            if(
    m) return {
                
    sexm[1],
                
    testm[2].split(','),
                
    mods: [m[3], m[4], m[5], m[6], m[7]]
            }
            return 
    false;
        },
        
        
    // склоняем слово по указанному набору правил и исключений
        
    word: function(wordsexwordTypegcase) {
            
    // исходное слово находится в именительном падеже
            
    if(gcase == this.gcaseNom) return word;
            
            
    // составные слова
            
    if(word.match(/[-]/)) {
                var list = 
    word.split('-');
                for(var 
    0= list.lengthni++) {
                    list[
    i] = this.word(list[i], sexwordTypegcase);
                }
                return list.
    join('-');
            }
            
            
    // Иванов И. И.
            
    if(word.match(/^[А-ЯЁ]\.?$/i)) return word;
            
            
    this.init();
            var 
    rules this.rules[wordType];

            if(
    rules.exceptions) {
                var 
    pick this.pick(wordsexgcaserules.exceptionstrue);
                if(
    pick) return pick;
            }
            var 
    pick this.pick(wordsexgcaserules.suffixesfalse);
            return 
    pick || word;
        },
        
        
    // выбираем из списка правил первое подходящее и применяем 
        
    pick: function(wordsexgcaserulesmatchWholeWord) {
            
    wordLower word.toLowerCase();
            for(var 
    0rules.lengthni++) {
                if(
    this.ruleMatch(wordLowersexrules[i], matchWholeWord)) {
                    return 
    this.applyMod(wordgcaserules[i]);
                }
            }
            return 
    false;
        },
        
        
    // проверяем, подходит ли правило к слову
        
    ruleMatch: function(wordsexrulematchWholeWord) {
            if(
    rule.sex == this.sexM && sex == this.sexF) return false// male by default
            
    if(rule.sex == this.sexF && sex != this.sexF) return false;
            for(var 
    0rule.test.lengthni++) {
                var 
    test matchWholeWord word word.substr(Math.max(word.length rule.test[i].length0));
                if(
    test == rule.test[i]) return true;
            }
            return 
    false;
        },
        
        
    // склоняем слово (правим окончание)
        
    applyMod: function(wordgcaserule) {
            switch(
    gcase) {
                case 
    this.gcaseNom: var mod '.'; break;
                case 
    this.gcaseGen: var mod rule.mods[0]; break;
                case 
    this.gcaseDat: var mod rule.mods[1]; break;
                case 
    this.gcaseAcc: var mod rule.mods[2]; break;
                case 
    this.gcaseIns: var mod rule.mods[3]; break;
                case 
    this.gcasePos: var mod rule.mods[4]; break;
                default: throw 
    "Unknown grammatic case: "+gcase;
            }
            for(var 
    0mod.lengthni++) {
                var 
    mod.substr(i1);
                switch(
    c) {
                    case 
    '.': break;
                    case 
    '-'word word.substr(0word.length 1); break;
                    default: 
    word += c;
                }
            }
            return 
    word;
        }
    }

    // new RussianName('Козлов Евгений Павлович')      // годится обычная форма
    // new RussianName('Евгений Павлович Козлов')      // в таком виде тоже
    // new RussianName('Козлов', 'Евгений')        // можно явно указать составляющие
    // new RussianName('Кунтидия', 'Убиреко', '', 'f') // можно явно указать пол ('m' или 'f')
    var RussianName = function(lastNamefirstNamemiddleNamesex) {
        if(
    typeof firstName == 'undefined') {
            var 
    lastName.match(/^\s*(\S+)(\s+(\S+)(\s+(\S+))?)?\s*$/);
            if(!
    m) throw "Cannot parse supplied name";
            if(
    m[5] && m[3].match(/(ич|на)$/) && !m[5].match(/(ич|на)$/)) {
                
    // Иван Петрович Сидоров
                
    lastName m[5];
                
    firstName m[1];
                
    middleName m[3];
                
    this.fullNameSurnameLast true;
            } else {
                
    // Сидоров Иван Петрович
                
    lastName m[1];
                
    firstName m[3];
                
    middleName m[5];
            }
        }
        
    this.ln lastName;
        
    this.fn firstName || '';
        
    this.mn middleName || '';
        
    this.sex sex || this.getSex();
    }
    RussianName.prototype = {
        
    // constants
        
    sexMRussianNameProcessor.sexM,
        
    sexFRussianNameProcessor.sexF,
        
    gcaseIm:   RussianNameProcessor.gcaseIm,   gcaseNomRussianNameProcessor.gcaseNom// именительный
        
    gcaseRod:  RussianNameProcessor.gcaseRod,  gcaseGenRussianNameProcessor.gcaseGen// родительный
        
    gcaseDat:  RussianNameProcessor.gcaseDat,                                           // дательный
        
    gcaseVin:  RussianNameProcessor.gcaseVin,  gcaseAccRussianNameProcessor.gcaseAcc// винительный
        
    gcaseTvorRussianNameProcessor.gcaseTvorgcaseInsRussianNameProcessor.gcaseIns// творительный
        
    gcasePredRussianNameProcessor.gcasePredgcasePosRussianNameProcessor.gcasePos// предложный
        
        
    fullNameSurnameLastfalse,
        
        
    ln''fn''mn''sex'',
        
    // если пол явно не указан, его можно легко узнать по отчеству
        
    getSex: function() {
            if(
    this.mn.length 2) {
                switch(
    this.mn.substr(this.mn.length 2)) {
                    case 
    'ич': return this.sexM;
                    case 
    'на': return this.sexF;
                }
            }
            return 
    '';
        },
        
        
    fullName: function(gcase) {
            return (
                (
    this.fullNameSurnameLast '' this.lastName(gcase) + ' ')
                + 
    this.firstName(gcase) + ' ' this.middleName(gcase) +
                (
    this.fullNameSurnameLast ' ' this.lastName(gcase) : '')
            ).
    replace(/^ +| +$/g'');
        },
        
    lastName: function(gcase) {
            return 
    RussianNameProcessor.word(this.lnthis.sex'lastName'gcase);
        },
        
    firstName: function(gcase) {
            return 
    RussianNameProcessor.word(this.fnthis.sex'firstName'gcase);
        },
        
    middleName: function(gcase) {
            return 
    RussianNameProcessor.word(this.mnthis.sex'middleName'gcase);
        }
    }

    doroga_94 и Admin нравится это.
  3. Basters Модератор

    Так же будет к месту простенькая функция для вывода правильных окончаний.

    21 контакт
    25 контактов и т.п.

    PHP:
    function declension($num$str)
        {
            
    $exp explode(','$str);
            
    $num = (($num 0) ? $num-$num*$num)%100;
            
    $dig = ($num 20) ? $num%10 $num;

            return 
    trim((($dig == 1) ? $exp[1] : (($dig || $dig 1) ? $exp[0] : $exp[2])));
        }
    Первый входящий параметр - $num - это ваше число, относительно которого нужно дописывать окончания.
    Второй входящий параметр - $str - это строка с набором возможных изменений, перечисляем через запятую
    Пример использования:
    PHP:
    echo $sum." ".declension($sum,'расходных материалов,расходный материал,расходных материала');


    Когда $sum = 4
    4 расходных материала
    Ког $sum = 40
    40 расходных материалов



    doroga_94, XmP и Admin нравится это.

Поделиться этой страницей