Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

PHP RUtils — маленькая библиотека для обработки русского текста

Anna | 31.05.2014 | нет комментариев

В работе на языке Python я частенько использую библиотеку Pytils для работы с русским текстом, и мне дюже не хватало этой библиотеки при работе на PHP. Допустимо, я искал нехорошо, но все, что я находил, не предоставляло сходственных вероятностей либо не слишком отвечало моим представлениям о чистом коде.

И вот, некогда я решил портировать библиотеку на PHP, и сейчас хочу поделиться ею с народом и дюже верю на поддержка в ее совершенствовании: буду рад советам, баг-репортам и исключительно pull-реквестам. Библиотека находится на GitHub’е: github.com/Andre-487/php_rutils

Вероятности библиотеки

PHP RUtils — порт Pytils на PHP. Это утилиты для работы с русским текстом. Утилиты поделены на следующие модули (классы):

  • Numeral — работа с числами: склонение существительных в зависимости от числа, числа прописью, суммы денег в рублях и копейках прописью.
  • Dt — работа с датами: растяжение формата дат PHP русскими именами месяцев, дней недели; временные периоды (скажем, 24 976 дней назад).
  • Translit — транслитерация, подготовка строк для применения в URL’ях, именах файлов.
  • Typo — маленький комплект правил типографики простого текста.

Примеры кода

Модуль Numeral
Выбор формы множественного числа
$variants = array(
    'гвоздь', //1
    'гвоздя', //2
    'гвоздей' //5
);
$amount = 15;
echo $amount, ' ', RUtils::numeral()->choosePlural($amount, $variants);
//Result: 15 гвоздей

echo RUtils::numeral()->getPlural(2, $variants);
//Result: 2 гвоздя
Выбор формы и итог прописью
echo RUtils::numeral()->sumString(1234, RUtils::MALE, $variants);
//Result: одна тысяча двести тридцать четыре гвоздя
Итог числа прописью
$numeral = RUtils::numeral();
echo $numeral->getInWordsInt(100);
//Result: сто

echo $numeral->getInWordsFloat(100.025);
//Result: сто целых двадцать пять тысячных

echo $numeral->getInWords(100.0);
//Result: сто
Итог суммы денег в рублях
echo RUtils::numeral()->getRubles(100.25);
//Result: сто рублей двадцать пять копеек
Модуль Dt
Сегодняшняя дата

Параметры передаются в качестве инстанса класса php_rutilsstructTimeParams, так же допустимо передавать их в виде массива

$params = new TimeParams();
$params->date = null; //это значение по умолчанию
$params->format = 'сегодня d F Y года';
$params->monthInflected = true;
echo RUtils::dt()->ruStrFTime($params);
//Result: сегодня 22 октября 2013 года
Историческая дата

Параметры передаются в качестве массива, поля такие же как в классе TimeParams.
Дата передается как строка в свободном формате. Так же допустимо передавать дату как Unix timestamp либо как инстанс класса DateTime.

$params = array(
    'date' => '09-05-1945',
    'format' => 'l d F Y была одержана победа над немецко-фашистскими захватчиками',
    'monthInflected' => true,
    'preposition' => true,
);
echo RUtils::dt()->ruStrFTime($params);
//Result: в среду 9 мая 1945 была одержана победа над немецко-фашистскими захватчиками
Временной период до фиксированной даты в прошлом

Форматы времени для данной функции аналогичны форматам для Dt::ruStrFTime.
Параметр $accuracy отвечает за подробность информации.

$toTime = new DateTime('05-06-1945');
echo RUtils::dt()->distanceOfTimeInWords($toTime);
//Result: 24 976 дней назад

$toTime = strtotime('05-06-1945');
$fromTime= null; //now
$accuracy = 3; //дни, часы, минуты
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy);
//Result: 24 976 дней, 11 часов, 21 минуту назад
Временной период между фиксированными датами
$fromTime = '1988-01-01 11:40';
$toTime = '2088-01-01 12:35';
$accuracy = 3; //дни, часы, минуты
echo RUtils::dt()->distanceOfTimeInWords($toTime, $fromTime, $accuracy);
//Result: через 36 525 дней, 0 часов, 55 минут
Модуль Translit
//Транслитерация
echo RUtils::translit()->translify('Муха — это крошечная птичка');
//Result: Muha - eto malen'kaya ptichka

//Обратное реформирование
echo RUtils::translit()->detranslify("SCHuka");
//Result: Щука

//Подготовка для применения в URL'ях либо путях
echo RUtils::translit()->slugify('Муха — это крошечная птичка');
//Result: muha---eto-malenkaya-ptichka
Модуль Typo
$text = <<<TEXT
...Когда В. И. Пупкин увидел в газете ( это была "Сермяжная правда" № 45) рубрику Weather Forecast (r),
он не поверил своим глазам - температуру обещали  -451F.
TEXT;

//Стандартные правила
echo RUtils::typo()->typography($text);
/**
 * Result:
 * ...Когда В. И. Пупкин увидел в газете (это была «Сермяжная правда» №45) рубрику Weather Forecast®,
 * он не поверил своим глазам — температуру обещали ±451°F.
 */

//Правила из комплекта "extended"
echo RUtils::typo()->typography($text, TypoRules::$EXTENDED_RULES);
/**
 * Result:
 * …Когда В. И. Пупкин увидел в газете (это была «Сермяжная правда» №45) рубрику Weather Forecast®,
 * он не поверил своим глазам — температуру обещали ±451собленных к выполнению как на веб-сервере, так и в консоли (в том числе в консоли Windows с ее cp866).

В данный момент я предпочел версию 0.1 для своей библиотеки, но я верю, что для нее найдутся пользователи, которые помогут развивать ее дальше, и она доберется до версии 1.0 и даже, чем черт не шутит, 2.0.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB