Транслитерация для русских букв в URL адресах
Здравствуйте ребятки) есть адрес допустим site.ru/раздел/Свадебная-флористика/ не подскажите ли как это дело транослинуть на латиницу?
Как запретить цифры в URL-адресах при написании
В общем задача такая: Имеется сайт, где есть большая группа таких адресов: .
Замена русских символов на латинские (транслитерация)
Текстовый фильтр-транслитератор. На входе — текстовый файл, на выходе — файл, в котором все русские.
Программа на паскале. Транслитерация русских слов в латиницу.
Здравствуйте, уважаемые программисты! Я тут собрался написать программку на Паскале, да только у.
Транслит русских символов для url
Добрый день. Необходимо генерировать url страницы из какого-либо названия названия. Использую.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
define('LNGtranslit1','а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,ы,ь,щ,ъ,э,ю,я'); define('LNGtranslit2','a,b,v,g,d,e,yo,j,z,i,iy,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,y,,sh,,e,yu,ya'); public static function translit($string,$max=60) [^A-Za-z0-9\._+-]
cia, Интересно) я вот так посмотрел и не уверен что это возможно применить к адресу на самом деле) Допустим даже если у менян не было cms, то как бы вы заставили работать это?
Сообщение было отмечено boilzzz как решение
Решение
Сообщение от boilzzz
В URL лучше избегать кириллицы вовсе. На самом деле это спорный вопрос, есть свои аргументы и за и против, не если сайт нацелен на многонациональную аудиторию, то однозначно в URL должны быть только латинские символы.
В базе данных в таблице, содержащей разделы, должно быть поле «alias» (обычно так его называют), содержащее псевдоним названия раздела на латинице, специально для URL. Его либо ручками заполнять либо генерировать автоматически исходя из введённого русского названия (в момент добавления/редактирования этого раздела). Такие вещи как разделы сайта, как правило, относительно редко меняются и меняются администратором сайта, поэтому можно всегда требовать ручного ввода псевдонима и не генерировать ничего вовсе. Что такое «свадебная флористика» не знаю, тоже похоже на какую-то категорию, значит с ней тоже самое.
В последствии никакими русскими буквами оперировать не надо, а использовать alias везде, где это необходимо.
PHP транслит
PHP функции для перевода текста, ЧПУ, ссылок и имен файлов в транслит.
Транслит для текста
function translit($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $value = strtr($value, $converter); return $value; > echo translit('Яндекс, Гугл, Майл ру');
Результат
Транслит для ЧПУ
Транслитерация для части URL (path), текст переводится в нижний регистр, пробелы и знаки препинания заменяются на « — ».
function translit_sef($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ); $value = mb_strtolower($value); $value = strtr($value, $converter); $value = mb_ereg_replace('[^-0-9a-z]', '-', $value); $value = mb_ereg_replace('[-]+', '-', $value); $value = trim($value, '-'); return $value; > echo translit_sef('Яндекс, Гугл, Майл ру');
Результат:
Транслит для URL
В данную функцию можно передавать URL целиком, домен и GET параметры останутся без изменений.
function translit_path($value) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ); $value = mb_strtolower($value); $value = strtr($value, $converter); $value = mb_ereg_replace('[^-0-9a-z\.]', '-', $value); $value = mb_ereg_replace('[-]+', '-', $value); $value = trim($value, '-'); return $value; > function traslit_url($url) < $url = parse_url(trim($url)); if (!empty($url['host'])) < $res = ''; if (!empty($url['scheme'])) < $res .= $url['scheme'] . '://'; >if (!empty($url['host'])) < $res .= idn_to_ascii($url['host']); >if (!empty($url['port'])) < $res .= ':' . $url['port']; >if (!empty($url['path'])) < $path = explode('/', $url['path']); foreach ($path as $i =>$row) < if (preg_match('/[а-яё]/iu', $row)) < $path[$i] = translit_path($row); >> $res .= implode('/', $path); > if (!empty($url['query'])) < $res .= '?' . $url['query']; >if (!empty($url['fragment'])) < $res .= '#' . $url['fragment']; >return $res; > else < return translit_path($url); >> echo traslit_url('https://example.com/category/статья о транслите.html?page=1');
Результат:
https://example.com/category/statya-o-translite.html?page=1
Транслит для имен файлов
function translit_file($filename) < $converter = array( 'а' =>'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', ); $new = ''; $file = pathinfo(trim($filename)); if (!empty($file['dirname']) && @$file['dirname'] != '.') < $new .= rtrim($file['dirname'], '/') . '/'; >if (!empty($file['filename'])) < $file['filename'] = str_replace(array(' ', ','), '-', $file['filename']); $file['filename'] = strtr($file['filename'], $converter); $file['filename'] = mb_ereg_replace('[-]+', '-', $file['filename']); $file['filename'] = trim($file['filename'], '-'); $new .= $file['filename']; >if (!empty($file['extension'])) < $new .= '.' . $file['extension']; >return $new; > echo translit_file('/upload/Пример файла.jpg');
Результат:
ЧПУ с помощью PHP для чайников
В большинстве современных CMS, где с помощью плагинов, а где и в самом ядре системы, реализована поддержка ЧПУ – человекопонятных адресов. Если вы посмотрите на адресную строку моего блога, то увидите что-то типа этого
https://upread.ru/blog/notes/chpu-s-pomoshhyu-php-dlya-chajnikov
А действительно, зачем это делать? Далеко не каждый человек вообще обращает внимание на адресную строку, тем более пытается там что-то разобрать. Дадим слово гуглу:
Структура URL сайта должна быть предельно простой. Попробуйте организовать контент так, чтобы URL имели логическую структуру и были понятны для человека (по возможности используйте слова, а не идентификаторы, состоящие из множества цифр). Например, при поиске информации об авиации URL типа http://ru.wikipedia.org/wiki/aviacia поможет оценить релевантность ссылки. Гораздо сложнее привлечь внимание пользователей с помощью URL-адреса типа http://www.example.com/index.php?id_sezione=360&sid=3a5ebc944f41daa6f849f730f1.
То есть, применительно к нашему блогу разбиваем url на части:
- https:// — защищенный протокол передачи данных;
- upread.ru – домен, адрес блога;
- blog – раздел, показывающий, что это блог;
- notes – раздел, показывающий, что это заметки;
- chpu-s-pomoshhyu-php-dlya-chajnikov – название заметки, которую, собственного говоря, вы и читаете.
Однако, если в КМС есть уже поддержка ЧПУ, транслитерация и другие инструменты, то, например, на моем блоге этого нет – у меня самописная CMS. Как же реализовано? Все просто, ниже покажу как.
Сначала небольшая ремарка. Если у вас есть какой-то опыт в сайтостроении, но вы не умеете делать ЧПУ с помощью .htaccess и php, то можете подумать, что я создал три каталога, а в них поместил файл index.html. Действительно, в принципе можно сделать каталоги blog, notes и nc-php и в последний положить индексный файл – и это будет работать! Но в реальности никто так не делает, все работают с .htaccess и php.
Итак, для начала нам надо переправить все запросы, которые не являются реальными файлами и каталогами в какой-то определенный файл, чаще всего это корень сайта, но никто вам не мешает создать и любой другой. Например, job.php. Добавьте в ваш .htaccess следующие строки:
RewriteEngine On Options +FollowSymlinks RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ job.php [L,QSA]
Теперь нам надо работать уже с PHP. Я снова возьму в пример свой сайт. Каждый материал на моем блоге доступен по адресу upread/art.php?id=xxx, где xxx – некоторое число, идентификатор материала. Как же нам передать идентификатор в файл job.php? Ну на самом деле способов немало. Можно распарсить url и в зависимости от него выводить нужную информацию:
if ($_SERVER['REQUEST_URI'] == '/blog/notes/chpu-s-pomoshhyu-php-dlya-chajnikov') < //тут выводим текст статьи >
Однако правильнее будет создать в базе данных отдельное поле для ЧПУ каждой записи и сравнивать перед выводом. Кстати, именно так реализован вывод, к примеру, в одной из самых распространенных CMS – WordPress. На картинке видно, что ЧПУ записан в поле post_name, а тот, из которого берется id материала — guid.
После того, как вы создали ЧПУ на своем сайте, вы можете увидеть, что у вас слетели стили. Почему так происходит? Все просто: если прописаны относительные пути к стилям скриптам, то браузер и пытается их загрузить из текущей директории. А не находя, естественно, выдает ошибку 404. Решается проблема просто: добавляем тэг base. Например, для моего блога он выглядит таким образом:
Вот так просто может создать свой человекопонятный урл даже самый чайник в сайтостроении. Если вам что-то непонятно или необходимо настроить систему URL на вашем сайте, то пишите мне – за небольшое вознаграждение я вам помогу.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
заметки, php, чпу, htaccess