Использую регулярное выражение для замены не алфавитных и не цифровых значений при загрузке файлов для проверки и изменений в названии, но почему то название "моя работа" выражение обрезает до "_работа", с английскими словами все отлично. Подскажите что я неправильно написал? $filename = preg_replace('#[^a-zA-Z0-9а-яА-ЯёЁ_\-\.]#u', '_', $filename); u-используется как обозначение кодировки, так как без него русские символы в виде кракозябр Спасибо Заранее
PHP: <?php $filename = '#$%^&моя работа'; $filename = preg_replace('#[^a-zA-Z0-9а-яА-ЯёЁ_\-\.]#u', '_', $filename); echo "{$filename} <br />"; $filename2 = '$%my work'; $filename2 = preg_replace('#[^a-zA-Z0-9а-яА-ЯёЁ_\-\.]#u', '_', $filename2); echo $filename2; На выходе получаю: т.е. ваша регулярка рабочая. p.s. проверял на PHP 5.6
Спасибо, но к сожалению почему-то в файлах на русском языке обрезает первое слово перед пробелом, который в свою очередь заменяет на _ Может быть дело в чем-то другом. Приведу полное выражение: public function cleanName($filename, $repeatCounter) { // Заменить все не алфавитно-цифровые символы (кроме _ и - и .) на _ $filename = preg_replace('#[^a-zA-Z0-9а-яА-ЯёЁ_\-\.]#u', '_', $filename); $this->randomizeName($filename); return $filename; }
попробовал загрузить файл с именем "my работа" и приходит в нормально виде "my_работа", почему он не принимает русские буквы до пробела не понимаю randomizeName как я понимаю должен говорить о случайном выборе имени. Сам не вдавался в суть этого. Так как мне было нужно, чтобы файлы можно было загружать как с русскими так и английскими именами, то я правил код компонента, чтобы это было возможным. Решение я кстати написал разработчикам, я задал им вопрос по поводу этого момента и так как сайт у них рухнул в настоящее время, то не знаю ответили ли они. А решение мне найти, так как загрузка файлов идет регулярно. Сам я новичок в php поэтому мне лично сложно понять сейчас что не так
На всякий случай версия php 5.5.9, так как может дело и в этом. Как вариант расматриваю прописать вместо а-яА-Я полностью абвгдеёжзиёклмнопрстуфхцчшщьъыэюяАБВГДЕЁЖЗИЁКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ. Код: PHP: protected function randomizeName(&$filename) { $params = $this->getParams(); if ($params->get('random_filename') == 1) { $length = (int) $params->get('length_random_filename'); if ($length < 6) { $length = 6; } $key = ""; $possible = "0123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRTVWXYZ"; $i = 0; while ($i < $length) { $char = String::substr($possible, mt_rand(0, String::strlen($possible) - 1), 1); $key .= $char; $i++; } $ext = JFile::getExt($filename); $filename = $key . '.' . $ext; } }}
Сегодня пытался найти проблему и вот о чем подумал, а не может быть это потому что у меня стоит php 5.5.9? Ведь с версии php 5.6 в php.ini по умолчанию стоит UTF-8, а до пустое значение. Сейчас прямо нет возможности это проверить, но завтра обязательно