Меню Рубрики

Яндекс api склонение по падежам

Склонение слов по падежам на php

У Яндекса есть очень удобный api сервис, который может трансформировать любое слово, или даже несколько слов, во все падежи. Воспользоваться сервисом очень просто, достаточно сделать запрос по адресу export.yandex.ru/inflect.xml?name=СЛОВО — в ответ будет получен xml со всеми склонениями слова.
Ниже я привел функцию, которая работает с api Яндекса и возвращает нужную форму слова.

Код функции:

И пример использования функции:

Склонение слов по падежам на php: 7 комментариев

За это огромное спасибо, работает на 5+!

А есть то же самое — но для глаголов?

Автор, подобные примеры надо смывать в унитаз! Сам то думал, что за пример показал и новички его ведь будут использовать?

У тебя скрипт делает 6 (ШЕСТЬ) запросов к серверу яндекса, при этом каждый раз яндекс отдаст ВСЕ падежи… представь сколько времени будет генерироваться страница?
Возвращать нужно одним массивом из функции и уже в основном скрипте брать с массива нужное.
Вот не менее функциональный вариант, но с 1 запросом и 1 проходом цикла в отличии от твоих шести.

function getNewFormText($text) <
$urlXml = «http://export.yandex.ru/inflect.xml?name=».urlencode($text);
$result = @simplexml_load_file($urlXml);
if($result) <
$arrData = array();
foreach ($result->inflection as $one) <
$arrData[] = (string) $one;
>
return $arrData;
>
return false;
>

——
// Основной скрипт. Видим что запрос к функции только один
// Здесь было бы разумно сделать проверку на размер массива «$text», вдруг яндекс ничего не вернул, тогда код ниже вызовет нотайсы и соответственно ничего не будет склонять
if(($text = getNewFormText($text)) !== false)
<
echo «Именительный падеж : » . $text[0]. «»;
echo «Родительный падеж : » . $text[1] . «»;
echo «Дательный падеж : » . $text[2]. «»;
echo «Винительный падеж : » .$text[3] . «»;
echo «Творительный падеж : » .$text[4]. «»;
echo «Предложный падеж : » . $text[5]. «»;
>

надо было ссылку дать на описание их API , спасибо так-то.. =) не знал

Источник статьи: http://vk-book.ru/sklonenie-slov-po-padezham-na-php/

Яндекс склонятор

Столкнулся с проблемой, что в договорах нужно писать фамилию, имя и отчество в родительном падеже. После небольшого поиска решения нашел бесплатный сервис Яндекса, которому просто нужно отправить http запрос, и сервер с радостью ответит набором склоненных слов.

В файле внешняя обработка с примером реализованной функции и ничего более. Скриншот обработки для теста.

Буду рад, если кому-то пригодится.

Скачать файлы

Специальные предложения

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

// функция в зависимости от переданного параметра возвращает ФИО
//
// Параметры:
// ФИО — строка. Если Можно вводить только Фамилию или Фимилия Имя или полное ФИО,
// разделитель пробел.
// Пол — Перечисления.Пол
// ТипВывода — числа 1: полное ФИО
// 2: Фамилия И.О.
// 3: И.О. Фамилия
// Возвращаемое значение:
// строка — результат форматирования
Функция обДательныйПадежНаСервере(ФИО,Пол,ТипВывода=0) Экспорт

ФИО_Падеж=»»;
Фамилия=»»;
Имя=»»;
Отчество=»»;
ФамилияПадеж=»»;
ИмяПадеж=»»;
ОтчествоПадеж=»»;
ФИО=СокрЛП(ФИО);
Длина=0;

Если СтрЧислоВхождений(ФИО,» «) = 0 Тогда
Фамилия = ФИО;
Длина = 1;
ИначеЕсли СтрЧислоВхождений(ФИО,» «) = 1 Тогда
Фамилия = Лев(ФИО,Найти(ФИО,» «)-1);
Имя = СтрЗаменить(ФИО,Фамилия+» «,»»);
Длина = 2;
ИначеЕсли СтрЧислоВхождений(ФИО,» «) = 2 Тогда
Фамилия = Лев(ФИО,Найти(ФИО,» «)-1);
Имя = Лев(СтрЗаменить(ФИО,Фамилия+» «,»»),Найти(СтрЗаменить(ФИО,Фамилия+» «,»»),» «)-1);
Отчество = СтрЗаменить(СтрЗаменить(ФИО,Фамилия+» «,»»),Имя+» «,»»);
Длина = 3;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Предупреждение! Неправильно записано ФИО. Проверьте пробелы!» + Символы.ПС + «(обДательныйПадежНаСервере)»;
Сообщение.Сообщить();
КонецЕсли;

Если (Нрег(Прав(Отчество,1))=»ч») Тогда
ТекПол = Перечисления.Пол.Муж;
ИначеЕсли (Нрег(Прав(Отчество,1))=»а») Тогда
ТекПол = Перечисления.Пол.Жен;
КонецЕсли;

Если ТекПол = Перечисления.Пол.Муж Тогда
КонецФамилии = Прав(Фамилия,1);
Если Нрег(КонецФамилии)=»е»
ИЛИ Нрег(КонецФамилии) = «и»
ИЛИ Нрег(КонецФамилии) = «о»
ИЛИ Нрег(КонецФамилии) = «у»
ИЛИ Нрег(КонецФамилии) = «э»
ИЛИ Нрег(КонецФамилии) = «ю»
Тогда
ФамилияПадеж = Фамилия;
ИначеЕсли Нрег(КонецФамилии) = «я» Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «е»;
ИначеЕсли Нрег(КонецФамилии) = «а» Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «е»;
ИначеЕсли Нрег(КонецФамилии) = «й»
ИЛИ Нрег(КонецФамилии) = «ь»
Тогда
Если Нрег(Прав(Фамилия,2)) = «ий»
ИЛИ Нрег(Прав(Фамилия,2)) = «ый»
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + «ому»;
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «ю»;
КонецЕсли
Иначе
Если Нрег(Прав(Фамилия,2)) = «ец» Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + «цу»;
Иначе
ФамилияПадеж = Фамилия + «у»;
КонецЕсли
КонецЕсли;

Если Имя = «Лев» Тогда
ИмяПадеж = «Льву»;
ИначеЕсли Имя=»Павел» Тогда
ИмяПадеж = «Павлу»;
ИначеЕсли Имя = «Пётр» Тогда
ИмяПадеж = «Петру»;
ИначеЕсли Нрег(Прав(Имя,1)) = «й»
ИЛИ Нрег(Прав(Имя,1)) = «ь»
Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + «ю»;
ИначеЕсли Нрег(Прав(Имя,1)) = «и» Тогда
ИмяПадеж = Имя;
ИначеЕсли Нрег(Прав(Имя,1)) = «а» Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + «е»;
Иначе
ИмяПадеж = Имя + «у»;
КонецЕсли;
ОтчествоПадеж = Отчество + «у»;
ИначеЕсли ТекПол = Перечисления.Пол.Жен Тогда
КонецФамилии = Прав(Фамилия,1);

Если Нрег(КонецФамилии) = «а» Тогда
Если Нрег(Прав(Фамилия,3)) = «ова»
ИЛИ Нрег(Прав(Фамилия,3))=»ева»
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «ой»;
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «е»;
КонецЕсли
ИначеЕсли Нрег(КонецФамилии) = «я» Тогда
Если Нрег(Прав(Фамилия,2)) = «ая» Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + «ой»;
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + «е»;
КонецЕсли
Иначе
ФамилияПадеж = Фамилия;
КонецЕсли;

Если Нрег(Прав(Имя,1)) = «а» Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + «е»;
ИначеЕсли Нрег(Прав(Имя,1)) = «я» Тогда
Если Нрег(Прав(Имя,2)) = «ия» Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + «и»;
Иначе
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + «е»;
КонецЕсли
Иначе
ИмяПадеж = Имя;
КонецЕсли;
ОтчествоПадеж = Лев(Отчество,СтрДлина(Отчество)-1) + «е»;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Предупреждение! Неправильно задан Пол. Проверьте!» + Символы.ПС + «(обДательныйПадежНаСервере)»;
Сообщение.Сообщить();
КонецЕсли;

Если Длина = 1 Тогда
ФИО_Падеж = «» + ФамилияПадеж;
ИначеЕсли Длина = 2 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = «» + ИмяПадеж + » » + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = «» + ФамилияПадеж + » » + Лев(ИмяПадеж,1) + «.»;
ИначеЕсли ТипВывода = 3 Тогда
ФИО_Падеж = «» + Лев(ИмяПадеж,1) + «.» + » » + ФамилияПадеж;
Иначе
ФИО_Падеж = «» + ФамилияПадеж + » » + ИмяПадеж;
КонецЕсли
ИначеЕсли Длина = 3 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = «» + ИмяПадеж + » » + ОтчествоПадеж + » » + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = «» + ФамилияПадеж + » » + Лев(ИмяПадеж,1) + «.» + » » + Лев(ОтчествоПадеж,1) + «.»;
ИначеЕсли ТипВывода=3 Тогда
ФИО_Падеж = «» + Лев(ИмяПадеж,1) + «.» + » » + Лев(ОтчествоПадеж,1) + «.» + » » + ФамилияПадеж;
Иначе
ФИО_Падеж = «» + ФамилияПадеж + » » + ИмяПадеж + » » + ОтчествоПадеж;
КонецЕсли
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Предупреждение! Это не ФИО. Проверьте!» + Символы.ПС + «(обДательныйПадежНаСервере)»;
Сообщение.Сообщить();
КонецЕсли;
Возврат ФИО_Падеж;
КонецФункции

Источник статьи: http://infostart.ru/public/193733/


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии