Склонение фраз по падежам php. Склонение ФИО — NameCaseLib PHP Framework. Функция разбивки ФИО на составляющие

Здравствуй, Хабрахабр!

Сегодня я расскажу о небольшом, но очень полезном фреймворке - NameCaseLib.

Я думаю, многие сталкивались с ситуацией, когда было необходимо просклонять Фамилию, Имя и Отчество человека по падежам. Данный фреймворк поможет нам избавиться от многочисленных «велосипедов».

Установка

Для работы NameCaseLib нам понадобится PHP5 и библиотека php_mbstring, для работы с текстом в формате UTF-8.

Отлично, теперь осталось подключить сам фреймворк, для этого скачаем необходимые файлы.

NameCaseLib поддерживает два языка: русский и украинский. Файл NCL.NameCase.ru.php содержит русские правила склонения, NCL.NameCase.ua.php, соответственно, украинские. В папке NCL расположено само «ядро» фреймворка, то есть, набор основных функций.

Итак, давайте создадим файл в формате.php, и проверим работоспособность данного фреймворка.

q("Максимов Александр Васильевич"); # Выводим получившийся массив. (Примечание: возвращает простой индексируемый массив) var_dump($array); ?>

Соответственно, таким же образом, мы можем склонять и украинские ФИО, подключив украинские правила склонения.

Но, давайте все-таки разберем, какие параметры содержит в себе метод q , и как его еще можно использовать?

Данный метод имеет 3 параметра, 2 из них - можно не указывать. Первый параметр - ФИО человека, второй - падеж (Список констант приведу ниже; в случае, если не указан падеж (NULL), то метод возвращает все падежи), и третий - пол человека. (Константы, также, приведены ниже; если не указать пол (NULL), метод определит его сам)

Константы

Для указания пола используются константы:
  • NCL::$MAN – мужской пол
  • NCL::$WOMAN – женский пол

Для указания падежей русского языка:

  • NCL::$IMENITLN - именительный падеж
  • NCL::$RODITLN - родительный падеж
  • NCL::$DATELN - дательный падеж
  • NCL::$VINITELN - винительный падеж
  • NCL::$TVORITELN - творительный падеж
  • NCL::$PREDLOGN - предложный падеж

Для указания падежей украинского языка:

  • NCL::$UaNazyvnyi – називний відмінок
  • NCL::$UaRodovyi – родовий відмінок
  • NCL::$UaDavalnyi – давальний відмінок
  • NCL::$UaZnahidnyi – знахідний відмінок
  • NCL::$UaOrudnyi – орудний відмінок
  • NCL::$UaMiszevyi – місцевий відмінок
  • NCL::$UaKlychnyi – кличний відмінок

Примечания

  1. Порядок расположения ФИО не имеет значения.
  2. Не имеет значение, в каком регистре указаны ФИО, после склонения, метод возвращает сохраненный регистр букв.

Определение части ФИО

С помощью метода getFullNameFormat, мы можем определить часть, или какие части ФИО мы используем.

getFullNameFormat("Максимов Александр Васильевич"); /* Мы получаем формат вида: S F N, где: - S - Фамилия - N - Имя - F - Отчество */ echo $fullName; ?>

Но, что же делать, если все-таки фреймворк не может правильно определить, как склонять выбранное вами ФИО?

Для этого в библиотеке предусмотрен метод qFullName, который позволяет указать Фамилию, Имя, Отчество и пол человека в определенной последовательности.

qFullName("Максимов", "Александр", "Васильевич", NCL::$MAN, NCL::$TVORITELN, "S N F")."\n"; ?>

Итоги

NameCaseLib - действительно удобный фреймворк, который включает в себя много полезных функций. На сайте имеется полная документация на русском языке.

Весьма популярной проблемой, с которой сталкиваются Web-программисты , это склонение слов на PHP . Например, нужно вывести, сколько минут назад была оставлено какое-нибудь сообщение. Можно написать просто число и слово "минут ". Но тогда будет написано весьма странно, например, "1 минут ", "2 минут " и так далее. Фактически, без склонения слов на PHP Вам не обойтись, если, конечно, Вы хотите писать по-русски.

Проблема новичкам покажется очень сложной, но, на самом деле, у склонения слов есть определённая закономерность. Посмотрите сами: "1 минута, 2 минуты, 5 минут, 11 минут, 19 минут, 21 минута, 22 минуты, 25 минут и так далее ". Видите закономерность? 1, 21, 31, 41 - всегда будет "минута ". Если младший разряд больше 1-го и меньше 5 , при этом само число при делении на 100 имеет остаток больше 20 (то есть, например, не число 12 и не 112 ), то будут "минуты ". В остальных случаях "минут ".

function getWord($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys;
return $suffix[$suffix_key];
}
$array = array("минута", "минуты", "минут"); $n = 21;

echo "$n $word
";
$n = 11;
$word = getWord($n, $array);
echo "$n $word
";
$n = 4;
$word = getWord($n, $array);
echo "$n $word
";
?>

Запустив данный скрипт Вы увидите, что склонение слов на PHP происходит на ура. Могу лишь добавить, что помимо "минут " там может быть "день ", "час ", "человек ", "компьютер " и все другие существительные, которые склоняются в зависимости от числительного .

Модуль morpher.so предназначен для склонения по падежам слов и словосочетаний - фамилий, имен и отчеств, названий городов и товаров - на русском и украинском языках.

Функция склонения по падежам

Один миллион долларов достается из Набережные Челны " , " rod " ); ?> !

В результате получаем:

Один миллион долларов достается Пупкину Василию из Набережных Челнов!

Функция morpher_inflect склоняет словосочетание в именительном падеже (первый аргумент) в любой падеж (второй аргумент). Падеж может принимать следующие значения:

Все строки, передаваемые в библиотеку, должны быть в кодировке UTF-8. Результат также возвращается в UTF-8.

Соответствующая функция для украинского языка называется morpher_ukr_inflect . Она работает пока только с фамилиями, именами и отчествами и отличается от русской названиями падежей:

Перевод во множественное число в украинской версии пока не реализован.

Функция разбивки ФИО на составляющие

Функция morpher_split_fio разбивает входную строку на массив из фамилии, имя, отчества

Ф : Пупкин И : Василий О :

Функция перевода во множественное число

Если ко второму параметру добавить строку "mn", то результат будет во множественном числе:

На складе осталось 238 .

На складе осталось 238 кочерёг.

Если первый параметр уже во множественном числе, то будет выдано:

#ERROR: Parameter 1 "text" is plural.

Функция определения рода

" ый " , " f " => " ая " , " n " => " ое " , " p " => " ые " ); $name = " знатоки " ; $rod = morpher_get_gender ($name ); echo " Уважаем " . $endings [ $rod ] . " " . $name . " !\n " ; ?>

Для определения рода фамилий, имен и отчеств на украинском языке служит функция morpher_ukr_get_gender . Она возвращает только "m" (мужской) или "f" (женский).

Функция прописи чисел и денежных сумм

Функция morpher_spell формирует пропись числа и ставит данную единицу измерения в нужный падеж:

календарный день " ); // 28 (Двадцать восемь) календарных дней morpher_spell (" 1,2 " , " процент " ); // 1,2 (Одна целая две десятых) процента morpher_spell (2 , " сутки " ); // 2 (Двое) суток ?>

Если пропись нужно вставить в текст в определенном падеже, укажите падеж третьим параметром:

В течение календарный день " , " Р " ); ?> .

В результате получим "В течение 28 (Двадцати восьми) календарных дней."

Допустимые значения падежей: И, Р, Д, В, Т, П и их аналоги, записанные латиницей, см. . Формы с предлогами (predl-o и gde) в этой функции не поддерживаются.

Для названий некоторых денежных единиц функция morpher_spell выдает пропись такого вида:

Сто двадцать три рубля 45 копеек morpher_spell (123.45 , " доллар США " ); // Сто двадцать три доллара США 45 центов morpher_spell (123.45 , " евро " ); // Сто двадцать три евро 45 центов ?>

При желании можно использовать сокращенные наименования денежных единиц, с точкой или без:

Сто двадцать три руб. 45 коп. morpher_spell (123.45 , " долл. США " ); // Сто двадцать три долл. США 45 центов morpher_spell (123.45 , " грн. " ); // Сто двадцать три грн. 45 коп. ?>

Или трехбуквенные коды валют международного стандарта ISO 4217, таких как RUB, USD, EUR и др. При этом в название денежной единицы автоматически включается название страны:

Сто двадцать три российских рубля 45 копеек morpher_spell (123.45 , " UAH " ); // Сто двадцать три украинских гривны 45 копеек morpher_spell (123.45 , " KZT " ); // Сто двадцать три казахских тенге 45 тиынов ?>

Обработка ошибок

При возникновении ошибки все функции библиотеки возвращают строку, начинающуюся с "#ERROR: " .

#ERROR: Parameter 1 "text" should not be empty.
#ERROR: Parameter 2 "case" should not be empty.
#ERROR: Parameter 1 "text" is not Russian.
#ERROR: Parameter 2 "case" is invalid.
#ERROR: Parameter 1 "text" is plural.

Если вы не хотите, чтобы пользователь увидел эти сообщения, проверяйте на наличие начальной подстроки "#ERROR: " .

Функция morpher_inflect ожидает 2 параметра, а morpher_get_gender - один. При вызове с неправильным количеством параметров интерпретатор PHP выдает предупреждение и продолжает выполнение программы.

Установка модуля на Linux

Начиная с версии 1.3.0 мы предоставляем модуль для Linux-версии PHP в виде предварительно скомпилированных файлов morpher.so, упакованных в архив. Эти файлы пригодны для использования в следующих дистрибутивах Linux:

  • Debian (Jessie, Stretch, Wheezy);
  • Ubuntu (Trusty, Xenial, Cosmic, Bionic);
  • CentOS 7.

Вам остается лишь написать нам, чтобы получить morpher.so для вашего дистрибутива, извлечь morpher.so из архива и morpher.so как расширение PHP. Однако бинарная совместимость такого модуля с вашей системой не гаранируется, поскольку мы собираем модуль только в "чистых" системах с настройками по умолчанию и с той версией PHP, которую предлагает системный пакетный менеджер. Если модуль несовместим, то PHP не сможет загрузить его как расширение. Если для вашей системы не подходит ни один из готовых файлов модуля, то вам необходимо собрать модуль из предоставляемого исходного кода.

Для удобства и упрощения процедуры сборки модуля в дистрибутив включен набор скриптов, которые автоматизируют установку необходимых для компиляции пакетов, сборку модуля и регистрацию модуля в качестве расширения для PHP. Учитывая большое разнообразие дистрибутивов операционной системы, различные варианты конфигурации и особенности сборки расширений для php, нужно понимать, что в некоторых случаях при установке модуля может возникнуть необходимость в дополнительных действиях, не реализуемых сборочными скриптами.

Для запуска процедуры автоматической установки распакуйте дистрибутив в любой каталог, например, morpher:

# mkdir morpher # cd morpher # tar xf ../morpher.tar # cd php

Запустите сборочный скрипт командой:

# bash build.sh

В случае успеха файл модуля morpher.so будет скомпилирован и перенесен в каталог расширений php. Модуль будет зарегистрирован в конфигурации php, а работоспособность модуля будет проверена автоматически с помощью теста. Текстовый вывод сборочного скрипта должен содержать сообщение об успешном тестировании:

Running tests... ... done.

Ваш модуль готов к использованию. Каталог теперь можно удалить:

# rm -r morpher

В случае наличия проблем со сборкой необходимо убедиться, что в вашей системе установлены и настроены все необходимые пакеты. Для сборки и работы модуля необходимо установить:

Вы можете запустить только сборку модуля без дополнительных действий командой:

# bash compile.sh

После успешной компиляции файл morpher.so будет находиться в каталоге morpher/php/modules .

Файл morpher.so необходимо поместить в каталог расширений PHP, например:

# php-config --extension-dir /usr/lib/php5/20121212 # mv modules/morpher.so /usr/lib/php5/20121212/

В вашей системе каталог расширений может быть другой.

# bash setup.sh

или самостоятельно указать имя расширения в файле php.ini . Проверить работоспособность расширения можно с помощью ручного запуска тестового PHP-скрипта из командной строки:

# php -f test.php Running tests... ... done.

Возможные ошибки при сборке и пути их устранения

Ошибка: /usr/bin/ld: cannot find -lm

Причина: у вас не установлен пакет glibc-static .

Ошибка: .../include/php/php_config.h:2526:30: error: call of overloaded ‘isnan(double&)’ is ambiguous. (номер строки может отличаться в вашей версии и конфигурации PHP)

Частенько возникает необходимость склонять имена на PHP . Согласитесь, что фраза "Добавить в друзья Илья " звучит намного хуже, чем "Добавить в друзья Илью ". Поэтому склонение имён по падежам в PHP требуется достаточно часто, и в этой статье я расскажу, как это можно реализовать у себя на сайте.

Сразу скажу, что идеального варианта, увы, нет. Первый вариант весьма очевидный: найти базу имён, которые будут во всех падежах, и добавить к себе эту таблицу. Затем по имени в именительном падеже искать соответствующий падеж по базе. Минусы тут очевидны: огромная база, всех имён не охватите, лишняя нагрузка на сервер .

Второй вариант - написать свой класс склонений имён на PHP , либо воспользоваться уже готовым. Поскольку правила в русском языке достаточно сложные, плюс есть масса исключений, поэтому и библиотека потребуется очень большая, да и даже она далеко не 100% спасение. Наиболее популярная из всех библиотек, занимающихся склонением имён на PHP , является NameCaseLib .

Скачав эту библиотеку и поместив на свой сайт, её можно использовать вот так:

Require_once "NCL.NameCase.ru.php"; // Подключаем русскую библиотеку
$case = new NCLNameCaseRu(); // Создаём объект класса NCLNameCaseRu
$array = $case->q("Русаков Михаил Юрьевич"); // Получаем массив из 6-ти элементов соответствующих 6-ти падежам, в которых окажется входная строка
print_r($array); // Выводим массив
?>

Как видите, использовать библиотеку очень просто. С другой стороны, мой главный совет будет следующий: по-возможности вообще избегайте необходимости склонять слова . Всё равно будут иногда вводить люди то, что склоняться никак не может, и попытки склонения будут выглядеть нелепо. Ведь необязательно писать "Добавить в друзья Илью ", можно же ведь написано просто "Добавить в друзья " на странице Ильи.

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

API склонения слов, получения рода(мужской, женский), падежа, склонения и других характеристик слова

API склонения слов

Параметры:
inflect - слово или список слов через прообел. Следующие параметры доступны, только если передано одно слово.
partofspeech
Дескриптор Пример Описание
C мама существительное
П красный прилагательное
КР_ПРИЛ красива краткое прилагательное
ИНФИНИТИВ идти инфинитив
Г идет глагол в личной форме
ДЕЕПРИЧАСТИЕ идя деепричастие
ПРИЧАСТИЕ идущий причастие
КР_ПРИЧАСТИЕ построена краткое причастие
ЧИСЛ восемь числительное (количественное)
ЧИСЛ-П восьмой порядковое числительное
МС он местоимение-существительное
МС-ПРЕДК нечего местоимение-предикатив
МС-П всякий местоименное прилагательное
Н круто наречие
ПРЕДК интересно предикатив
ПРЕДЛ под предлог
СОЮЗ и союз
МЕЖД ой междометие
ЧАСТ же, бы частица
ВВОДН конечно вводное слово
ФРАЗ бухты-барахты, зги фразеологизм
grammems – . Задаются через ","(запятую). Для исключения перед граммемой укажите "-"(минус)
Граммема Описание
Род
мр мужской род
жр женский род
ср средний род
мр-жр общий род (сирота, пьяница)
Число
ед единственное число
мн множественное число
Падеж
им именительный
рд родительный
дт дательный
вн винительный
тв творительный
пр предложный
зв звательный (отче, боже)
2 второй родительный или второй предложный падежи
Время
нст настоящее время
буд будущее время
прш прошедшее время
Лицо
первое лицо
второе лицо
третье лицо
Одушевленность
од одушевленное
но неодушевленное
Вид
св совершенный вид
нс несовершенный вид
Переходность
нп переходный
пе непереходный
Залог
дст действительный залог
стр страдательный залог
Другое
0 неизменяемое
безл безличный глагол
пвл повелительное наклонение (императив)
притяж притяжательное (не используется)
прев превосходная степень (для прилагательных)
сравн сравнительная степень (для прилагательных)
кач качественное прилагательное
Семантические признаки
имя имя (Иван, Михаил)
фам фамилия (Иванов, Сидоров)
отч отчество (Иванович, Михайлович)
лок топоним (Москва, Лена, Эверест)
аббр аббревиатура (КПСС, РОНО)
орг организация
вопр вопросительное наречие
указат указательное наречие
жарг жаргонизм
разг разговорный
арх архаизм
опч опечатка
поэт поэтическое
проф профессионализм
info – вывести каждую форму в виде массива с дополнительной информацией

Http://сайт/service/api.php?inflect=магадан&json

{"0":"МАГАДАН","1":"МАГАДАНА","2":"МАГАДАНУ","3":"МАГАДАНОМ","4":"МАГАДАНЕ","5":"МАГАДАНЫ", "6":"МАГАДАНОВ","7":"МАГАДАНАМ","8":"МАГАДАНАМИ","9":"МАГАДАНАХ","limit":38}

Http://сайт/service/api.php?inflect=магадан












Http://сайт/service/api.php?inflect=ростов-на-дону&xml

<0>РОСТОВ-НА-ДОНУ <1>РОСТОВА-НА-ДОНУ <2>РОСТОВУ-НА-ДОНУ <3>РОСТОВОМ-НА-ДОНУ <4>РОСТОВЕ-НА-ДОНУ 46

Чтобы получить от слова «свадебный» все неодушевленные прилагательные в множественном числе вызовите:

Https://сайт/service/api.php?inflect=свадебный&json&partofspeech=П&grammems=НО,МН&info
Получите:
{"0":{"word":"СВАДЕБНЫМ","partofspeech":"П","grammems":["ДТ","КАЧ","МН","НО","ОД"]}, "1":{"word":"СВАДЕБНЫЕ","partofspeech":"П","grammems":["ИМ","КАЧ","МН","НО","ОД"]}, "2":{"word":"СВАДЕБНЫЕ","partofspeech":"П","grammems":["ВН","КАЧ","МН","НО"]}, "3":{"word":"СВАДЕБНЫХ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","РД"]}, "4":{"word":"СВАДЕБНЫХ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","ПР"]}, "5":{"word":"СВАДЕБНЫМИ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","ТВ"]} ,"limit":19} Без параметра info:
http://сайт/service/api.php?inflect=свадебный&json&partofspeech=П&grammems=НО,МН
{"0":"СВАДЕБНЫМ","1":"СВАДЕБНЫЕ","2":"СВАДЕБНЫЕ","3":"СВАДЕБНЫХ", "4":"СВАДЕБНЫХ","5":"СВАДЕБНЫМИ","limit":19}

API получения рода слова, имени: мужской, женский

API получения пола: мужской, женский по имени. С помощью данного API по имени пользователя Вы сможете получить его пол. Это исключит необходимость заполнения дополнительного поря при регистрации.

Загрузка...
Top