Наша взаимовыгодная связь https://banwar.org/
Привіт привіт!
Сьогоднішня стаття може бути корисна користувачам, які вирішили реалізувати власними силами роботу функції ucwords (), але працює це тільки з латинськими літерами. Ця функція переводить перший символ кожного слова у верхній регістр. Десятий питання, навіщо така штука потрібна: я поставив завдання і вирішую її доступними засобами. Якщо раптом вам знадобилася ця фіча - аве мені.
Для початку подивимося, які інструменти необхідні. Найголовніше, потрібен PHP версії 5.1.0 або вище, в них регулярними виразами додали розширені послідовності для роботи з UTF-8. І ще одна важлива умова - в списку розширень PHP має бути mbstring; відразу зазначу, що дане розширення мені зустрічалося на всіх хостингах, якими користувався.
Спершу вирішимо, що буде словом. Слово - це послідовність букв (або одна буква), яка починає рядок або розташована після роздільників - пробільних символів або знаків пунктуації.
Порушуючи попередні структури статей, відразу привожу рішення. Функція носить ім'я utf8_ucwords (). В якості єдиного параметра передається текст в кодуванні UTF-8.
function utf8_ucwords ($ str) {$ expr = '! (^ | \ pM | \ pP | \ pZ) (\ pL)! mue'; return preg_replace ($ expr, ' "$ 1". mb_strtoupper ( "$ 2", "UTF-8")', $ str); }
Вам необхідно один раз визначити цю функцію. Після цього перетворювати рядки можна хоча б так:
$ Str = utf8_ucwords ( 'привіт, чувак!');
Тепер розберемо детально першого і другий рядок тіла функції.
Параметр $ expr являє собою регулярний вираз, яке отримує значення першого символу кожного слова.
Символи, розташовані після знаку оклику - m, u, e - встановлюють внутрішні опції механізму регулярних вирази. Їх призначення:
- m - передана рядок сприймається як набір рядків (вибачте за тавтологію). Це означає, що нам потрібно обробка символів переносу;
- u - вказує, що аналізований текст представлений в кодуванні UTF-8;
- e - спеціальна опція, яка примушує інтерпретувати другий параметр функції preg_replace () (про неї трохи пізніше) як код.
Символ! (Знак оклику) виступає як роздільник. PHP, на відміну від Perl або JavaScript, не має вбудованих інструкцій для роботи з регулярними виразами, тому ті представляються звичайними рядками.
Перейдемо безпосередньо до розбору знаків між! і! . Вираз складається з двох «кишень». Кожен «кишеню» буде потрібно описати особливо.
Перший - (^ | \ pM | \ pP | \ pZ) - шукає символ, що випереджає «слово». Це може бути:
- ^ - початок пропозиції або нового рядка;
- \ PM - знак (пробільний, непробельний або навколишній);
- \ PP - знак пунктуації;
- \ PZ - роздільник (рядки або абзацу, або пробільний).
По суті, так ми визначаємо початок слова.
Далі залишається отримати перший символ. За це відповідає другий «кишеню» - (\ pL), який повертає першу букву.
Важливо використовувати саме такий контекст. Модифікатор u наказує трактувати рядок в кодуванні UTF-8, а послідовність \ pL повертає перший символ слова. Для багатобайтові кодувань це дуже важливо, адже у них кожен символ може бути представлений декількома байтами. Звичайно, використання регулярних виразів, та ще й з повним аналізом рядки, трохи сповільнить ваш код. Але ми не збираємося працювати з гігабайтами тексту, вірно?
Другий рядок тіла функції повертає результуючий значення. Ми використовуємо функцію регулярних виразів:
preg_replace ($ expr, $ ch, $ str)
яка шукає в рядку $ str значення $ expr, і замінює його на $ ch. Відмінність від штатної str_replace () в тому, що замінюючи не жётско заданий рядок, а значення, що відповідають умові, в даному випадку - перша буква кожного слова.
Другий парметр функції, який покликаний замінити знайдені значення, являє собою повноцінний PHP код. У ньому значення першого «кишені» $ 1 конкатенуються з результатом роботи функції mb_strtoupper (), яка переводить букву в верхній регістр.
Невеликий приклад, щоб ви могли відчути в повній мірі, про що йдеться.
$ Str = 'це просте речення, aga! і ще крапля текста.как-то так. '; echo utf8_ucwords ($ str); / * Виведе: Це Просте Пропозиція, Aga! І Ще Крапля Текста.Как-Те Так. * /
Користуйтеся на здоров'я!
Якщо виникнуть питання, будь ласка, задавайте в коментарях, постараюся донести доступно.
Автор публікації
не в мережі 2 тижні
x64 (aka andi)
Коментарі: 2847 Публікації: 395 Реєстрація: 02-04-2009
Але ми не збираємося працювати з гігабайтами тексту, вірно?