«Моя территория мысли»

ЧПУ адреса на PHP

  • Разработка

  • 6 Март 2017

  • 37

  • 0

ЧПУ адреса на PHP

В недавней статье «Склонение слов на PHP» я затрагивал PHP расширение Intl, советую к прочтению (будет проще вникнуть в содержимое настоящей статьи), решения представленные в настоящей статье, будут также базироваться на вышеуказанном расширении. Перед нами стоит задача, преобразование строки, как правило это заголовок, в ЧПУ URL или как я его называю «Символьный код объекта». Опять же, как я люблю говорить, задача тривиальная, но какие решения мы встречаем чаще всего? Пусть даже в популярных библиотеках или фреймворках? Как правило это массив буквенных преобразований, то самое всеми любимое избитое клише. В этой статье мы разберем почему буквенные преобразования это плохой вариант и какая альтернатива более приемлема...

Работал у меня на медиа-портале парень из Украины, он писал статьи, новости и подобный текстовый контент. Однажды я стал замечать, что некоторые его статьи, открыть просто невозможно, у них небыло ЧПУ URL кода. Потом я понял, что раскладка у него другая и буквенные преобразования работали не правильно, так как преобразовательный массив был оптимизирован только под русские буквы. Решение нужно было здесь и сейчас, я расширил массив украинским и белорусским алфавитами, ну решение я скажу так себе, завтра с этой системой будет работать человек из Китая, после завтра человек из Германии, мне каждый день заполнять массив, пока я не соберу в одном месте все возможные алфавиты? Это абсурд с которым трудно не согласится. Выше описанное событие прекрасно демонстрирует непригодность такого подхода, как буквенные преобразования.

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

function slug($rawString)
{
	$stringSluggable = $rawString;

	$stringSluggable = transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $stringSluggable);

	$stringSluggable = preg_replace(['/[^a-z0-9-]/', '/-+/'], '-', $stringSluggable);

	$stringSluggable = trim($stringSluggable, '-');

	return $stringSluggable;
}

Вот и весь секрет, все действительно настолько просто, пользоваться так:

var_dump(slug('Мой шикарный заголовок отражающий всю суть моего шикарного поста'));

Результатом будет, что-то вроде такого:
moj-sikarnyj-zagolovok-otrazausij-vsu-sut-moego-sikarnogo-posta

Скачать готовую функцию можно здесь.

Настоятельно рекомендую изучить это расширение из официальной документации.

Функции которые были использованы в этом уроке:
transliterator_transliterate

Спасибо за внимание!

Комментарии