Здравствуйте. Нужно строковые переменные, которые выглядят так: photo/Стимпанк/Э814/Э814_09_PERED.jpg на photo/Стимпанк/Э814/e814_09_pered.jpg Есть ли какая-то одна функция для этой задачи в php?
да, я знаю про неё. просто получается надо сначала 1. выделить только имя файла, чтобы всё остальное осталось в исходном регистре, 2. изменить регистр. 3. заменить на э на e Итого три функции. Может есть какая мощная функция типа preg_match чтобы в одну операцию всё сделать?
спасибо. столкнулся с шагом 3 - почему функция Код (Text): $file_name = str_replace("э", "e", $file_name); не заменяет 'э' на 'e'? на вход функции идут строки вида
и так пробовал Код (Text): mb_ereg_replace("/[э]/", "e", $file_name); и так $file_name = preg_replace ('/э/','e', $file_name); и ещё как-то. не понимаю. В чем причина?
Всё работает Код (PHP): echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg'); photo/Стимпанк/e814/e814_09_PERED.jpg
не знаю, что сказать вот это Код (Text): echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg'); выводит
Код (PHP): <? setlocale(LC_CTYPE, 'ru_RU'); $p='/Э814/Э814_09_PERED.jpg'; $newp=dirname($p).'/'.mb_strtolower(basename($p), 'UTF-8'); echo $newp; ?> Добавлено спустя 6 минут 2 секунды: Ой ! Э на е? Тфу Добавлено спустя 23 минуты 31 секунду: Код (PHP): <? setlocale(LC_CTYPE, 'ru_RU'); $p='/Э814/Э814_09_PERED.jpg'; $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8'); $fname=mb_eregi_replace('э', 'e', $low); $res=$d.$fname; echo $res; ?> Добавлено спустя 15 минут 4 секунды: Блин! Что со мной?! Код (Text): =php<? setlocale(LC_CTYPE, 'ru_RU'); $p='photo/Стимпанк/Э814/Э814_09_PERED.jpg'; $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8'); $fname=mb_eregi_replace('э', 'e', $low); $res=$d.$fname; echo $res; Добавлено спустя 1 минуту 53 секунды: Код (PHP): <? setlocale(LC_CTYPE, 'ru_RU'); $p='photo/Стимпанк/Э814/Э814_09_PERED.jpg'; $d=dirname($p).'/'; $low=mb_strtolower(basename($p), 'UTF-8'); $fname=mb_eregi_replace('э', 'e', $low); $res=$d.$fname; echo $res;?>
Доброе утро. Приключения продолжаются и пока не получается Может надо посмотреть шире и глубже весь код(привожу два варианта функции мой и ваш INETCHIK): Код (Text): <?php function GetListFiles1($folder,&$all_files){ $fp=opendir($folder); while (false !== ($cv_file = readdir($fp))) { if(is_file($folder."/".$cv_file)) { setlocale(LC_CTYPE, 'ru_RU'); $file_name = mb_substr($cv_file, mb_strrchr($cv_file, '/')); echo $file_name." "; $file_name = mb_strtolower($file_name); echo $file_name." "; $file_name = str_replace("э", "e", $file_name); $file_name = mb_eregi_replace("э", "e", $file_name); $file_name = preg_replace ('/э/','e', $file_name); //echo mb_eregi_replace('э', 'e', 'photo/Стимпанк/Э814/Э814_09_PERED.jpg')."<br/>"; echo $file_name."<br/>"; $new_name = $folder."/".$file_name; //echo "new_name = ".$new_name."<br/>"; //rename($folder."/".$cv_file, $folder."/".$new_name); $all_files[]=$folder."/".$cv_file; }elseif($cv_file!="." && $cv_file!=".." && is_dir($folder."/".$cv_file)){ GetListFiles1($folder."/".$cv_file,$all_files); } } closedir($fp); } function GetListFiles2($folder,&$all_files){ $fp=opendir($folder); while (false !== ($cv_file = readdir($fp))) { if(is_file($folder."/".$cv_file)) { echo "cv_file = $cv_file, "; setlocale(LC_CTYPE, 'ru_RU'); $d=dirname($cv_file).'/'; $low=mb_strtolower(basename($cv_file), 'UTF-8'); $fname=mb_eregi_replace('э', 'e', $low); $res=$d.$fname; echo "low = $low, fname = $fname, res = $res<br/>"; $new_name = $folder."/".$file_name; //echo $new_name."<br/>"; //rename($folder."/".$cv_file, $folder."/".$new_name); $all_files[]=$folder."/".$cv_file; } elseif($cv_file!="." && $cv_file!=".." && is_dir($folder."/".$cv_file)){ GetListFiles2($folder."/".$cv_file,$all_files); } } closedir($fp); } $all_files1=array(); $all_files2=array(); GetListFiles1("photo",$all_files1); echo "<br/><br/><br/>"; GetListFiles2("photo",$all_files2); //print_r($all_files); ?> и пример двух строк их вывода: вывод первой функции: вывод вашего функции с вашим кодом: в Вашем коде уже в low получается отсечка буквы э вместо подмены. Может настройки либо версия php Денвера влияют? PHP Version 5.3.13
лучше установи новую версию php, сейчас последняя стабильная версия 5.6.5 http://php.net/downloads.php
я самим по себе PHP пока не пользовался, только в рамках локальных серверов. установив его, я смогу видеть результаты исполнения своих php файлов?
borus, ты сам себе системный администратор, на эти темы есть книги, можно почитать. Обычно php подключают к веб серверу используя разные способы. Можно пойти дальше и установить в виртуальную машину linux и всё остальное (apache, php, mysql...), чтобы быть ближе реальности. Всё очень просто если понимать принцип как всё работает и взаимодействует.
Здравствуйте. Не понял мысли... Дорогой Игорь, вы можете предположить, почему команда Код (Text): $fname=mb_eregi_replace('э', 'e', $low); не подменяет э на латинскую e? вот var_dump($low); : Может что-то с кодировкой?
borus , установи например open-server.ru там версия php более свежая. В базе можно хранить имена: id, real_name, path, ... а файл называть по id.
Значит не видит такой. Если у вас нет локального сервера, вы дооооооолго будете мучить внешний с таким подходом. По политике. Для начала запретите не латинские имена файлов. Кириллицу осилить можно, но это все равно извращение. Ни один дивайс не генерит файлов с русскими именами. Или может у нас уже есть цифровая Смена 8-М которая выдает "Картинка0001.жпг"? То есть если у вас тип файла все равно латинскими буквами, то они уже есть и стало быть все остальное справедливо потребовать в латинице. Для конца - теоретически файлы можно переименовывать, а оригинальные названия хранить в бд. Скажем поступил файл Вася Ест Опилки.png. Вы делаете запись в базе, получаете (или выячисляете) текущий индекс (автоинкремент) записи и записываете файл под этим самым номером. Номера такие уникальны, стало быть файловая система нипоцтрадает. Чтобы выдать файл читаете бд, берете оригинальное имя и номер записи, по номеру открываете файл и выдаете под оригинальным именем. Никто ничего не заметил. Разумеется если такие файлы линковать в хтмл, то они будут под номерами, или придется писать скрипт выдачи файлов который все это будет делать влет. То есть в хтмле например img src="/upload/users/pics/Вася Ест Опилки.jpg", но никакой такой папки не существует - и через htaccess или там через index.php запрос поступает в модуль upload.php, который ищет такой файл и выдает его из другой, недоступной для веба папки (или просто другой). Но тогда и в бд имена файлов должны быть уникальны, иначе по имени не найдешь. Поэтому делают просто: img src="/upload/users/pics/12-Вася Ест Опилки.jpg - число 12, которое легко отождествить - это и есть номер записи.
просто мне дали кучу файлов раскиданных по подпапкам, содержащих русскую Э в названии. Мне надо: 1. Переименовать все Э на E в файлах, реально, на уровне файловой системы, так как потом эти картинки мне придётся заливать на сайт. 2. Получить список урлов на эти файлы, сгруппированные по артикулу, который закодирован в части названия этих файлов. Например Э028 в названии файлов - это артикул и надо на выходе получить таблицу в html с полями "артикул", "список урлов к переименованным картинкам товара разделённых |" для последующей генерации csv файла и его импорта на сайт. Вот и колдую, и никак не пойму почему уважаемому php сложно поменять в "э" на "e" просто в строковых переменных, не говоря уже о переименовании файлов? Please help...
Скачай новую версию и попробуй в ней. Можно без веб сервера в командной строке: php test.php или так http://php.ru/manual/features.commandline.webserver.html Интересно сколько ещё раз ты проигнорируешь совет.