За последние 24 часа нас посетили 12520 программистов и 660 роботов. Сейчас ищут 334 программиста ...

большие буквы на маленькие и наоборот

Тема в разделе "PHP для новичков", создана пользователем selivanov, 9 май 2018.

  1. selivanov

    selivanov Новичок

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4
    нашел функцию которая в строке меняет большие буквы на маленькие и наоборот
    только не могу понять почему символ ASCII находится между 97 и 122 его надо пропустить через srtoupper - вроде логически надо менять на маленькую то есть пропустить через strtolower
    Код (Text):
    1.  
    2. function change($str)
    3. {
    4.     $arr = str_split($str, 1);
    5.     $str2 = '';
    6.     foreach ($arr as $item) {
    7.         if (ord($item) >= 97 && ord($item) <= 122) {
    8.             $str2 .= strtoupper($item);
    9.         }else {
    10.             $str2 .= strtolower($item);
    11.         }
    12.     }
    13.     return $str2;
    14. }
    15.  
    16. echo change('bbb,GGG');
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.523
    Симпатии:
    504
    @selivanov, всё там правильно.
    PHP:
    1. echo chr(97),chr(98), chr(99); // abc, а не ABC
    Другое дело, что с той же кириллицей эта функция работать не будет.
     
    selivanov нравится это.
  3. selivanov

    selivanov Новичок

    С нами с:
    1 фев 2017
    Сообщения:
    123
    Симпатии:
    4
    с
    кинь ссылку на нормальную таблицу ASCII
    --- Добавлено ---
    оказывается таблицу ASCII КОТОРУЮ я нашел не правилььная там символы от 97-до 122 заглавные .отсюда и конфуз
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.530
    Симпатии:
    1.277
    Адрес:
    Лень
    mb_*
     
    selivanov нравится это.
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.523
    Симпатии:
    504
    Таблица символов ASCII
    --- Добавлено ---
    Вообще, можно сделать как-то так:
    PHP:
    1. <?php
    2. function changeCase($str = '') {
    3.     return  preg_replace_callback('/\p{L}/u', function($a){
    4.         return ($upper = mb_strtoupper($a[0], 'UTF-8')) == $a[0] ? mb_strtolower($a[0], 'UTF-8') : $upper;
    5.     }, $str);
    6. }
     
    selivanov нравится это.
  6. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    242
    Симпатии:
    4
    А если попробовать -
    ctype_lower ( string $text )
    ctype_upper ( string $text )
    Они по идеи должны давать результат вне зависимости от кодировки и языка.

    https://php.ru/manual/function.ctype-lower.html
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.509
    Симпатии:
    340
    @glorsh66, обратили внимание на фразу: "Возвращает TRUE, если каждый символ в строке text является строчной буквой в текущей локали"?
     
    glorsh66 нравится это.
  8. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    242
    Симпатии:
    4
    Вариант для английского

    Или нужно вручную установить
    setlocale(LC_CTYPE, 'ru.UTF-8')


    Код (Text):
    1. private function reverse_lower_to_upper(string  $str): string
    2. {
    3.     $len = strlen($str);
    4.     $result_str="";
    5.     for ($i=0;$i<$len;$i++)
    6.     {
    7.         if (ctype_lower($str[$i])) $result_str.= strtoupper($str[$i]);
    8.         else $result_str.= strtolower($str[$i]);
    9.     }
    10.     return $result_str;
    11. }
     
  9. glorsh66

    glorsh66 Активный пользователь

    С нами с:
    9 июл 2017
    Сообщения:
    242
    Симпатии:
    4
    Универсальная с использованием mb_ функций

    Но она работает значительно медленнее.

    Код (Text):
    1.     private function reverse_lower_to_upper_mb(string  $str): string
    2.     {
    3.         $len = mb_strlen($str);
    4.         $result_str="";
    5.         for ($i=0;$i<$len;$i++)
    6.         {
    7.         $low= mb_strtolower(mb_substr($str,0+$i,1));
    8.         $upp= mb_strtoupper(mb_substr($str,0+$i,1));
    9.         $cur = mb_substr($str,0+$i,1);
    10.         if ($low===$cur) $result_str.=$upp;
    11.         else $result_str.=$low;
    12.  
    13.         }
    14.         return $result_str;
    15.     }
    если возникнут проблемы с кодировкой можно в ручную указать кодировк утекста в
    Код (Text):
    1. mb_substr($str,0+$i,1,'UTF-8')