За последние 24 часа нас посетили 18054 программиста и 1744 робота. Сейчас ищут 1004 программиста ...

Сменить регистр и подменить буквы одной функцией

Тема в разделе "PHP для новичков", создана пользователем borus, 28 янв 2015.

  1. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте.

    Нужно строковые переменные, которые выглядят так:
    photo/Стимпанк/Э814/Э814_09_PERED.jpg
    на
    photo/Стимпанк/Э814/e814_09_pered.jpg

    Есть ли какая-то одна функция для этой задачи в php?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    да, я знаю про неё. просто получается надо сначала
    1. выделить только имя файла, чтобы всё остальное осталось в исходном регистре,
    2. изменить регистр.
    3. заменить на э на e
    Итого три функции. Может есть какая мощная функция типа preg_match чтобы в одну операцию всё сделать?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    лучше три операции чем один прегмач
     
  5. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    спасибо.
    столкнулся с шагом 3 - почему функция
    Код (Text):
    1. $file_name = str_replace("э", "e", $file_name);
    не заменяет 'э' на 'e'?
    на вход функции идут строки вида
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  7. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    и так пробовал
    Код (Text):
    1. mb_ereg_replace("/[э]/", "e", $file_name);
    и так
    $file_name = preg_replace ('/э/','e', $file_name);
    и ещё как-то. не понимаю. В чем причина?
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Всё работает
    Код (PHP):
    1. echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg'); 
    photo/Стимпанк/e814/e814_09_PERED.jpg
     
  9. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    :) не знаю, что сказать
    вот это
    Код (Text):
    1. echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg');
    выводит
     
  10. INETCHIK

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

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    Код (PHP):
    1. <?
    2. setlocale(LC_CTYPE, 'ru_RU');
    3. $p='/Э814/Э814_09_PERED.jpg';
    4. $newp=dirname($p).'/'.mb_strtolower(basename($p), 'UTF-8');
    5. echo $newp;
    6. ?>
    Добавлено спустя 6 минут 2 секунды:
    Ой ! Э на е? Тфу

    Добавлено спустя 23 минуты 31 секунду:
    Код (PHP):
    1. <?
    2. setlocale(LC_CTYPE, 'ru_RU');
    3. $p='/Э814/Э814_09_PERED.jpg';
    4. $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8');
    5. $fname=mb_eregi_replace('э', 'e', $low);
    6. $res=$d.$fname; echo $res;
    7. ?>
    Добавлено спустя 15 минут 4 секунды:
    Блин! Что со мной?!
    Код (Text):
    1. =php<?
    2. setlocale(LC_CTYPE, 'ru_RU');
    3. $p='photo/Стимпанк/Э814/Э814_09_PERED.jpg';
    4. $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8');
    5. $fname=mb_eregi_replace('э', 'e', $low);
    6. $res=$d.$fname; echo $res;
    Добавлено спустя 1 минуту 53 секунды:
    Код (PHP):
    1. <?
    2. setlocale(LC_CTYPE, 'ru_RU');
    3. $p='photo/Стимпанк/Э814/Э814_09_PERED.jpg';
    4. $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8');
    5. $fname=mb_eregi_replace('э', 'e', $low);
    6. $res=$d.$fname; echo $res;?>
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.809
    Симпатии:
    1.332
    Адрес:
    Лень
    ты еще забыл <?php
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    short_open_tag видимо включил.
     
  13. INETCHIK

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

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    ты еще забыл <?php
    этого я точно не забыл. . .
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    лучше используй <?PHP нежели <?
     
  15. INETCHIK

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

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    До хмл мне еще далеко...
     
  16. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Доброе утро.
    Приключения продолжаются и пока не получается
    Может надо посмотреть шире и глубже весь код(привожу два варианта функции мой и ваш INETCHIK):
    Код (Text):
    1.  
    2. <?php
    3.  
    4. function GetListFiles1($folder,&$all_files){
    5.     $fp=opendir($folder);
    6.     while (false !== ($cv_file = readdir($fp))) {
    7.         if(is_file($folder."/".$cv_file)) {
    8.             setlocale(LC_CTYPE, 'ru_RU');
    9.             $file_name = mb_substr($cv_file, mb_strrchr($cv_file, '/'));
    10.             echo $file_name."   ";
    11.             $file_name = mb_strtolower($file_name);
    12.             echo $file_name."   ";
    13.             $file_name = str_replace("э", "e", $file_name);
    14.             $file_name = mb_eregi_replace("э", "e", $file_name);
    15.             $file_name = preg_replace ('/э/','e', $file_name);
    16.             //echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg')."<br/>";
    17.             echo $file_name."<br/>";
    18.             $new_name = $folder."/".$file_name;
    19.             //echo "new_name = ".$new_name."<br/>";
    20.             //rename($folder."/".$cv_file, $folder."/".$new_name);
    21.             $all_files[]=$folder."/".$cv_file;
    22.         }elseif($cv_file!="." && $cv_file!=".." && is_dir($folder."/".$cv_file)){
    23.             GetListFiles1($folder."/".$cv_file,$all_files);
    24.         }
    25.     }
    26.     closedir($fp);
    27. }
    28.  
    29. function GetListFiles2($folder,&$all_files){
    30.     $fp=opendir($folder);
    31.     while (false !== ($cv_file = readdir($fp))) {
    32.         if(is_file($folder."/".$cv_file)) {
    33.             echo "cv_file = $cv_file, ";
    34.             setlocale(LC_CTYPE, 'ru_RU');
    35.             $d=dirname($cv_file).'/';
    36.             $low=mb_strtolower(basename($cv_file), 'UTF-8');
    37.             $fname=mb_eregi_replace('э', 'e', $low);
    38.             $res=$d.$fname;
    39.             echo "low = $low, fname = $fname, res = $res<br/>";
    40.             $new_name = $folder."/".$file_name;
    41.             //echo $new_name."<br/>";
    42.             //rename($folder."/".$cv_file, $folder."/".$new_name);
    43.             $all_files[]=$folder."/".$cv_file;
    44.         }
    45.         elseif($cv_file!="." && $cv_file!=".." && is_dir($folder."/".$cv_file)){
    46.             GetListFiles2($folder."/".$cv_file,$all_files);
    47.         }
    48.     }
    49.     closedir($fp);
    50. }
    51.  
    52. $all_files1=array();
    53. $all_files2=array();
    54. GetListFiles1("photo",$all_files1);
    55. echo "<br/><br/><br/>";
    56. GetListFiles2("photo",$all_files2);
    57. //print_r($all_files);
    58. ?>
    и пример двух строк их вывода:
    вывод первой функции:
    вывод вашего функции с вашим кодом:
    в Вашем коде уже в low получается отсечка буквы э вместо подмены.
    Может настройки либо версия php Денвера влияют? PHP Version 5.3.13
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    лучше установи новую версию php, сейчас последняя стабильная версия 5.6.5 http://php.net/downloads.php
     
  18. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    я самим по себе PHP пока не пользовался, только в рамках локальных серверов. установив его, я смогу видеть результаты исполнения своих php файлов?
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Постепенно приходи к мысли что файлы не должны храниться под своими именами...
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    borus, ты сам себе системный администратор, на эти темы есть книги, можно почитать.
    Обычно php подключают к веб серверу используя разные способы.
    Можно пойти дальше и установить в виртуальную машину linux и всё остальное (apache, php, mysql...), чтобы быть ближе реальности.

    Всё очень просто если понимать принцип как всё работает и взаимодействует.
     
  21. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте. Не понял мысли...
    Дорогой Игорь, вы можете предположить, почему команда
    Код (Text):
    1. $fname=mb_eregi_replace('э', 'e', $low);
    не подменяет э на латинскую e?
    вот var_dump($low); :
    Может что-то с кодировкой?
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    borus , установи например open-server.ru там версия php более свежая.
    В базе можно хранить имена: id, real_name, path, ...
    а файл называть по id.
     
  23. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Значит не видит такой. Если у вас нет локального сервера, вы дооооооолго будете мучить внешний с таким подходом.

    По политике. Для начала запретите не латинские имена файлов. Кириллицу осилить можно, но это все равно извращение. Ни один дивайс не генерит файлов с русскими именами. Или может у нас уже есть цифровая Смена 8-М которая выдает "Картинка0001.жпг"? То есть если у вас тип файла все равно латинскими буквами, то они уже есть и стало быть все остальное справедливо потребовать в латинице. Для конца - теоретически файлы можно переименовывать, а оригинальные названия хранить в бд. Скажем поступил файл Вася Ест Опилки.png. Вы делаете запись в базе, получаете (или выячисляете) текущий индекс (автоинкремент) записи и записываете файл под этим самым номером. Номера такие уникальны, стало быть файловая система нипоцтрадает. Чтобы выдать файл читаете бд, берете оригинальное имя и номер записи, по номеру открываете файл и выдаете под оригинальным именем. Никто ничего не заметил. Разумеется если такие файлы линковать в хтмл, то они будут под номерами, или придется писать скрипт выдачи файлов который все это будет делать влет. То есть в хтмле например img src="/upload/users/pics/Вася Ест Опилки.jpg", но никакой такой папки не существует - и через htaccess или там через index.php запрос поступает в модуль upload.php, который ищет такой файл и выдает его из другой, недоступной для веба папки (или просто другой). Но тогда и в бд имена файлов должны быть уникальны, иначе по имени не найдешь. Поэтому делают просто: img src="/upload/users/pics/12-Вася Ест Опилки.jpg - число 12, которое легко отождествить - это и есть номер записи.
     
  24. borus

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

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    просто мне дали кучу файлов раскиданных по подпапкам, содержащих русскую Э в названии. Мне надо:
    1. Переименовать все Э на E в файлах, реально, на уровне файловой системы, так как потом эти картинки мне придётся заливать на сайт.
    2. Получить список урлов на эти файлы, сгруппированные по артикулу, который закодирован в части названия этих файлов. Например Э028 в названии файлов - это артикул и надо на выходе получить таблицу в html с полями "артикул", "список урлов к переименованным картинкам товара разделённых |" для последующей генерации csv файла и его импорта на сайт.
    Вот и колдую, и никак не пойму почему уважаемому php сложно поменять в "э" на "e" просто в строковых переменных, не говоря уже о переименовании файлов?
    Please help... :)
     
  25. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Скачай новую версию и попробуй в ней.
    Можно без веб сервера в командной строке: php test.php
    или так http://php.ru/manual/features.commandline.webserver.html

    Интересно сколько ещё раз ты проигнорируешь совет.