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

Тема в разделе "PHP", создана пользователем Rabben, 5 янв 2011.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Rabben

    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;
    }
    
     
  2. Xata6

    Xata6 Постоялец

    Регистр.:
    20 мар 2007
    Сообщения:
    84
    Симпатии:
    5
    попробуй для начала так
    function generate_slug($text, $options=array())
    {
    $text=iconv('UTF-8', 'CP1251', $text);

    если не поможет то тогда при получении текста вырезай все символы из него, далее регекспом заменяй пробелы на _, а текст можно определять и так ([a-zA-Zа-яА-Я0-9])
     
  3. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    Если кодировка 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);
    ...
    или переводить в транслит
     
    Rabben нравится это.
  4. Mxnrl

    Mxnrl Постоялец

    Заблокирован
    Регистр.:
    29 апр 2010
    Сообщения:
    50
    Симпатии:
    1
    Лучше перегонять через вот эти функции - к удивлению работают гооораздо быстрее

    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;
        }
     
  5. Rabben

    Rabben

    Регистр.:
    26 мар 2009
    Сообщения:
    159
    Симпатии:
    10
    Спасибо, а еще подскажите, как сделать, чтобы прописные буквы оставались прописными
     
  6. polyetilen

    polyetilen Заблокирован

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