Хелпер Text

Комментарии: 3  Просмотры: 9 044

Продолжаем рассмотрение Хелперов и на этот раз я расскажу только об одном классе — Text, так как он содержит очень много полезных методов.

Класс Text
Класс Text предназначен для работы с текстом, соответственно большинство методов класса так или иначе связано с его обработкой.
Допустим, нам нужно ограничить количество символов или слов в тексте. Для этого есть два метода: limit_chars и limit_words. Оба метода принимают в качестве параметров строку (обязательно), количество символов/слов (по умолчанию 100) и конечный символ (по умолчанию NULL, который при обработке заменяется на троеточие). Метод limit_chars принимает еще один необязательный параметр — обрезать конечное слово или нет. Несколько примеров использования:

$text = Text::limit_words('очень очень много лишних слов', 3); // Получим "очень очень много…"
$text = Text::limit_words('очень очень много лишних слов', 3, '__'); // Получим "очень очень много__"
 
$text = Text::limit_chars('привет мир', 5); // Получим "приве…"
$text = Text::limit_chars('привет мир', 5, NULL, TRUE); // Получим "…", т.к. первое слово состоит из шести букв
 
$text = Text::limit_chars('хай всем вам', 5); // Получим "хай в…"
$text = Text::limit_chars('хай всем вам', 5, NULL, TRUE); // Получим "хай…"

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

Метод alternate выводит первое неиспользованное слово из списка, переданного в качестве параметров. Если все слова использованы, вывод продолжается по кругу. В некоторых случаях может пригодиться.

echo Text::alternate('камень', 'ножницы', 'бумага'); // "камень"
echo Text::alternate('камень', 'ножницы', 'бумага'); // "ножницы"
echo Text::alternate('камень', 'ножницы', 'бумага'); // "бумага"
echo Text::alternate('камень', 'ножницы', 'бумага'); // "камень"

Следующий метод — random очень полезен и используется достаточно часто (для тех же паролей). Он генерирует случайную строку указанной длины. Принимает два необязательных параметра: тип и количество символов. По умолчанию случайным образом генерируется строка длиной 8 символов, состоящая из чисел и букв (в том числе и прописных). Можно генерировать строку, состоящую только из чисел, только из букв, из чисел, но без нуля и так далее (существующие типы вы можете посмотреть в классе). Если представленных типов недостаточно для получения нужного результата, в метод можно передать свой набор символов, например, русские буквы.

$str = Text::random(); // "0IPrTKLY" тип по умолчанию - alnum
$str = Text::random('hexdec', 15); // "faf07e050026bec"
$str = Text::random('123абвгдежз', 10); // "зв1дзб3а32"

Идем дальше. Метод ucfirst делает заглавной первую букву каждого слова в строке с разделителем. Первый параметр — обязательный и это обрабатываемая строка. Второй — необязательный и это разделитель (по умолчанию разделитель — знак «тире»).

$str = Text::ucfirst('content-type'); // Получим "Content-Type"

Возможно кому-то пригодится метод reduce_slashes. Он уменьшает количество подряд идущих слэшей (знак «/») до одного.

$str = Text::reduce_slashes('foo//bar/baz'); // Получим "foo/bar/baz"

Защититься от нецензурной лексики поможет метод censor. Просто «запикаем» ненужные слова:

$str = 'Сам баран ! Такой козел, что еще поискать';
$bad_words = array('баран', 'козел');
 
$str = Text::censor($str, $bad_words); // Получим "Сам ##### ! Такой #####, что еще поискать"

Можно поменять «запикивания», а также запретить замену в частях слов. Для этого передадим необязательные параметры:

$str = 'Хорошая уродилась морковка.Никакой урод не повырывал';
$bad_words = array('урод');
 
$str = Text::censor($str, $bad_words, 'x'); // Получим "Хорошая xxxxилась морковка.Никакой xxxx не повырывал"
$str = Text::censor($str, $bad_words, 'x', FALSE); // Получим "Хорошая уродилась морковка.Никакой xxxx не повырывал"

Очень интересный метод similar ищет одинаковые буквосочетания в словах.

$array = array('fred', 'fran', 'free');
$match = Text::similar($array); // вернет "fr"

Но тут есть косяк.Данный метод не работает с русскими словами, что естественно, учитывая присутствие в методе функций substr и strlen. Что мешало разработчикам это поправить, тем более, что есть замечательный класс UTF8 ? Непонятно.

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

// Получим <a href="http://kohanaframework.su/">http://kohanaframework.su/</a>
$text = Text::auto_link('http://kohanaframework.su/');
 
// Получим <a href="mailto:mymail@email.ru">mymail@email.ru</a>
$text = Text::auto_link('mymail@email.ru');

Но лучше использовать отдельные методы auto_link_urls и auto_link_emails, каждый для своего типа ссылок.

Метод, расставляющий теги «p» и «br» у текста при использовании переносов называется auto_p. Может пригодиться в гостевой книге или в комментариях.

// Получим "<p>Первая строка<br />Вторая строка</p>"
$text = 'Первая строка
         Вторая строка';
 
$text = Text::auto_p($text);

И последний рассматриваемый метод класса «Text» предназначен для избежания так называемых «висячих» слов. Что это такое — больше пояснит картинка:

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

$text = Text::widont($text);

«За кадром» остались два метода: bytes и number. Первый выводит размер файла в человеческом формате, т.е. с припиской «Mb», «kB» итд (применимо, например, для файлового архива). Второй выводит число также в человеческом формате, но также на английском. Поэтому их полезность у меня лично под сомнением. Разве что переделать. Как правильно изменять существующие методы, добавлять свои методы, а также создавать свои классы-хелперы, обо всем об этом я еще расскажу. До встречи в следующем уроке.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 3 коммент.

«функций substr и strlen. Что мешало разработчикам это поправить, тем более, что есть замечательный класс UTF8 ? »

А что если переопределить метод используя методы из UTF8?

Ну я так и сделал. Просто почему разработчики не сделали это изначально-непонятно.

Поделитесь хелпером :)



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.