Требуется помощь с исправлением русской ЧПУ

Статус
В этой теме нельзя размещать новые ответы.

Rabben

Старатель
Регистрация
26 Мар 2009
Сообщения
159
Реакции
10
Есть функция, которая генерирует ЧПУ. Проблема в том, что она не понимает русские символы а-яА-Я. Помогите исправить.

Код:
function generate_slug($text, $options=array())
{
    if (!isset($options['case'])) {
      $text = strtolower($text);
    }
    
    $space = $options['space'] ? $options['space'] : '-';
    
    // strip all non word chars
    $text = preg_replace('/\W/', ' ', $text);
 
    // replace all white space sections with a dash
    $text = preg_replace('/\ +/', $space, $text);
 
    // trim dashes
    $text = preg_replace('/\-$/', '', $text);
    $text = preg_replace('/^\-/', '', $text);
 
    return $text;
}
 
попробуй для начала так
function generate_slug($text, $options=array())
{
$text=iconv('UTF-8', 'CP1251', $text);

если не поможет то тогда при получении текста вырезай все символы из него, далее регекспом заменяй пробелы на _, а текст можно определять и так ([a-zA-Zа-яА-Я0-9])
 
Если кодировка windows-1251
PHP:
<?
function generate_slug($text, $options=array())
{
    if (!isset($options['case'])) {
      $text = strtolower($text);
    }
    
    $space = $options['space'] ? $options['space'] : '-';
    // strip all non word chars
    //$text = preg_replace('/\W/', ' ', $text);
    $text = preg_replace('/[^A-zА-яёЁ0-9_]/', ' ', $text);
    // replace all white space sections with a dash
    $text = preg_replace('/\ +/', $space, $text);
    // trim dashes
    $text = preg_replace('/\-$/', '', $text);
    $text = preg_replace('/^\-/', '', $text);
    return $text;
}


echo generate_slug("Aaa bbb ccc абц 111 }{");
?>
если utf-8 то
PHP:
<?
function generate_slug($text, $options=array())
{
    if (!isset($options['case'])) {
      $text = mb_strtolower($text);
    }
    
    $space = $options['space'] ? $options['space'] : '-';
    // strip all non word chars
    //$text = preg_replace('/\W/', ' ', $text);
    $text = preg_replace('/[^A-zА-яёЁ0-9_]/u', ' ', $text);
    // replace all white space sections with a dash
    $text = preg_replace('/\ +/', $space, $text);
    // trim dashes
    $text = preg_replace('/\-$/', '', $text);
    $text = preg_replace('/^\-/', '', $text);
    return $text;
}


mb_internal_encoding("UTF-8");
echo generate_slug("Aaa bbb ccc Абцдеёя 111 }{");
?>
но если этот текст будет в ссылке, то надо кодировать и перед кодированием текст должен быть в utf-8 кодировке
PHP:
...
return urlencode($text);
...
или переводить в транслит
 
  • Заблокирован
  • #4
Лучше перегонять через вот эти функции - к удивлению работают гооораздо быстрее

PHP:
<?php
function cp1251_to_utf8($txt) {
        $in_arr = array(
            chr(208), chr(192), chr(193), chr(194),
            chr(195), chr(196), chr(197), chr(168),
            chr(198), chr(199), chr(200), chr(201),
            chr(202), chr(203), chr(204), chr(205),
            chr(206), chr(207), chr(209), chr(210),
            chr(211), chr(212), chr(213), chr(214),
            chr(215), chr(216), chr(217), chr(218),
            chr(219), chr(220), chr(221), chr(222),
            chr(223), chr(224), chr(225), chr(226),
            chr(227), chr(228), chr(229), chr(184),
            chr(230), chr(231), chr(232), chr(233),
            chr(234), chr(235), chr(236), chr(237),
            chr(238), chr(239), chr(240), chr(241),
            chr(242), chr(243), chr(244), chr(245),
            chr(246), chr(247), chr(248), chr(249),
            chr(250), chr(251), chr(252), chr(253),
            chr(254), chr(255)
        );

        $out_arr = array(
            chr(208) . chr(160), chr(208) . chr(144), chr(208) . chr(145),
            chr(208) . chr(146), chr(208) . chr(147), chr(208) . chr(148),
            chr(208) . chr(149), chr(208) . chr(129), chr(208) . chr(150),
            chr(208) . chr(151), chr(208) . chr(152), chr(208) . chr(153),
            chr(208) . chr(154), chr(208) . chr(155), chr(208) . chr(156),
            chr(208) . chr(157), chr(208) . chr(158), chr(208) . chr(159),
            chr(208) . chr(161), chr(208) . chr(162), chr(208) . chr(163),
            chr(208) . chr(164), chr(208) . chr(165), chr(208) . chr(166),
            chr(208) . chr(167), chr(208) . chr(168), chr(208) . chr(169),
            chr(208) . chr(170), chr(208) . chr(171), chr(208) . chr(172),
            chr(208) . chr(173), chr(208) . chr(174), chr(208) . chr(175),
            chr(208) . chr(176), chr(208) . chr(177), chr(208) . chr(178),
            chr(208) . chr(179), chr(208) . chr(180), chr(208) . chr(181),
            chr(209) . chr(145), chr(208) . chr(182), chr(208) . chr(183),
            chr(208) . chr(184), chr(208) . chr(185), chr(208) . chr(186),
            chr(208) . chr(187), chr(208) . chr(188), chr(208) . chr(189),
            chr(208) . chr(190), chr(208) . chr(191), chr(209) . chr(128),
            chr(209) . chr(129), chr(209) . chr(130), chr(209) . chr(131),
            chr(209) . chr(132), chr(209) . chr(133), chr(209) . chr(134),
            chr(209) . chr(135), chr(209) . chr(136), chr(209) . chr(137),
            chr(209) . chr(138), chr(209) . chr(139), chr(209) . chr(140),
            chr(209) . chr(141), chr(209) . chr(142), chr(209) . chr(143)
        );

        $txt = str_replace($in_arr, $out_arr, $txt);
        return $txt;
    }

    function utf8_to_cp1251($txt) {
        $in_arr = array(
            chr(208), chr(192), chr(193), chr(194),
            chr(195), chr(196), chr(197), chr(168),
            chr(198), chr(199), chr(200), chr(201),
            chr(202), chr(203), chr(204), chr(205),
            chr(206), chr(207), chr(209), chr(210),
            chr(211), chr(212), chr(213), chr(214),
            chr(215), chr(216), chr(217), chr(218),
            chr(219), chr(220), chr(221), chr(222),
            chr(223), chr(224), chr(225), chr(226),
            chr(227), chr(228), chr(229), chr(184),
            chr(230), chr(231), chr(232), chr(233),
            chr(234), chr(235), chr(236), chr(237),
            chr(238), chr(239), chr(240), chr(241),
            chr(242), chr(243), chr(244), chr(245),
            chr(246), chr(247), chr(248), chr(249),
            chr(250), chr(251), chr(252), chr(253),
            chr(254), chr(255)
        );

        $out_arr = array(
            chr(208) . chr(160), chr(208) . chr(144), chr(208) . chr(145),
            chr(208) . chr(146), chr(208) . chr(147), chr(208) . chr(148),
            chr(208) . chr(149), chr(208) . chr(129), chr(208) . chr(150),
            chr(208) . chr(151), chr(208) . chr(152), chr(208) . chr(153),
            chr(208) . chr(154), chr(208) . chr(155), chr(208) . chr(156),
            chr(208) . chr(157), chr(208) . chr(158), chr(208) . chr(159),
            chr(208) . chr(161), chr(208) . chr(162), chr(208) . chr(163),
            chr(208) . chr(164), chr(208) . chr(165), chr(208) . chr(166),
            chr(208) . chr(167), chr(208) . chr(168), chr(208) . chr(169),
            chr(208) . chr(170), chr(208) . chr(171), chr(208) . chr(172),
            chr(208) . chr(173), chr(208) . chr(174), chr(208) . chr(175),
            chr(208) . chr(176), chr(208) . chr(177), chr(208) . chr(178),
            chr(208) . chr(179), chr(208) . chr(180), chr(208) . chr(181),
            chr(209) . chr(145), chr(208) . chr(182), chr(208) . chr(183),
            chr(208) . chr(184), chr(208) . chr(185), chr(208) . chr(186),
            chr(208) . chr(187), chr(208) . chr(188), chr(208) . chr(189),
            chr(208) . chr(190), chr(208) . chr(191), chr(209) . chr(128),
            chr(209) . chr(129), chr(209) . chr(130), chr(209) . chr(131),
            chr(209) . chr(132), chr(209) . chr(133), chr(209) . chr(134),
            chr(209) . chr(135), chr(209) . chr(136), chr(209) . chr(137),
            chr(209) . chr(138), chr(209) . chr(139), chr(209) . chr(140),
            chr(209) . chr(141), chr(209) . chr(142), chr(209) . chr(143)
        );

        $txt = str_replace($out_arr, $in_arr, $txt);
        return $txt;
    }
 
Спасибо, а еще подскажите, как сделать, чтобы прописные буквы оставались прописными
 
Чтоб оставались заглавные буквы, надо убрать функцию strtolower или mb_strtolower которая переводит в строчные буквы. Но в функции есть проверка для букв изменять или нет это массив $options['case']
PHP:
    if (!isset($options['case'])) {
      $text = strtolower($text);
    }
может где в настройках есть указания или в функцию передавать любое значение case чтоб не изменял
PHP:
generate_slug("Aaa bbb ccc абц 111 }{", array("case"=>1))
или просто удалить из функции эту проверку.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху