Нужна помощь в правильном написании регулярного выражения

Да хз. Смотреть надо в комплексе, настройки хостинга, сами скрипты, кодировки файлов в которых скрипты, просто настройки кодировок и проочее.
Несколько раз попадалось такое - кривые хостеры. Но есть ещё варианты, когда всё вроде настроено почти правильно, а всё равно..
Ключевое слово почти. Слава богу попадается редко, так что тебе повезло.
Но я бы не грешил на хостинг, пока не убедился бы сам, что со скриптами, кодировками, настройками и прочим всё в порядке.
Ты должен понимать, что во столь мелкие ньюансы никто вникать не станет и помогать соответственно тоже.
И да. Кроме setlocal ещё есть варианты.
 
\s добавь к перечислению в []
 
не помогло, к сожалению, убралось нижнее подчеркивание_, а первое слово так и удаляется, с английскими словами все отлично. Может в каком то скрипте надо добавить в регулярное выражение кириллицу

Если перед русскими буквами пишу латинские "my работы", то приходить название загружается "my_работы"
 
Последнее редактирование:
Ваше регулярное выражение вполне работает.
Я проверил на Для просмотра ссылки Войди или Зарегистрируйся (наверху выбор версии и запуск) в разных версиях php этот код:
PHP:
$filename = 'моя работа';
$filename = preg_replace('#[^а-яА-ЯёЁ0-9a-zA-Z_\-\.]#u', '_', $filename);
echo $filename;
всегда выдает: "моя_работа"
Может быть функция randomizeName всё портит ?
 
Возможно, но в его коде я ничего такого не увидел, чтобы могло удалять слова. Функция randomizeName
Код:
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 = JString::substr($possible, mt_rand(0, JString::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, а до пустое значение.
 
Последнее редактирование:
Я не внимательно прочел что тебе нужно и по этому не то что надо посоветовал. У тебя опенсервер есть? там можно выбирать версию PHP. Скорее всего проблема в кодировке.
 
Я не внимательно прочел что тебе нужно и по этому не то что надо посоветовал. У тебя опенсервер есть? там можно выбирать версию PHP. Скорее всего проблема в кодировке.

В общем олова кипит. Написал короче выражение $filename = preg_replace('#[^\w\d_\-\.]#iu', ' ', $filename); эффект тот же самый то есть было "Моя работа" стало "Моя_работа"

Если пишу выражение так (галочка перед скобкой) $filename = preg_replace('#^[\w\d_\-\.]#iu', ' ', $filename); то выражение "Моя работа" становиться "оя работа" и он не проверять ничего, то есть не идет замена пробела на _

Кодировка стоит utf-8? проверил в базе данных, в php.ini default_charset стоит utf-8
 
Тебе уже несколько человек написало, что регулярное выражение верное и дело не в нём.
Выше я давал совет - перечислить абвгд и т.д в регулярке, должно сработать. Но не факт что в другом месте о грабли не споткнёшься.
Тут надо глобально проблему решать.
Но это хорошо, что пытаешься разобраться)))
 
В общем олова кипит. Написал короче выражение $filename = preg_replace('#[^\w\d_\-\.]#iu', ' ', $filename); эффект тот же самый то есть было "Моя работа" стало "Моя_работа"

Если пишу выражение так (галочка перед скобкой) $filename = preg_replace('#^[\w\d_\-\.]#iu', ' ', $filename); то выражение "Моя работа" становиться "оя работа" и он не проверять ничего, то есть не идет замена пробела на _

Кодировка стоит utf-8? проверил в базе данных, в php.ini default_charset стоит utf-8
Ты осознай что ты сказал делать скрипту
$filename = preg_replace('#^[\w\d_\-\.]#iu', ' ', $filename);
#^ - начало строки.
далее один символ который [\w\d_\-\.] заменить на ' '.
Тебе php и сделал то что ты ему указал. Он заменил первый символ строки (уд. условию [\w\d_\-\.])
____________________
$filename = preg_replace('#[^\w\d_\-\.]#iu', ' ', $filename); эффект тот же самый то есть было "Моя работа" стало "Моя_работа"
По поводу этого, скажу: быть такого не может! Разве что в твоем сервере завелись гремлины, которые творят пакости.
 
Тебе уже несколько человек написало, что регулярное выражение верное и дело не в нём.
Выше я давал совет - перечислить абвгд и т.д в регулярке, должно сработать. Но не факт что в другом месте о грабли не споткнёшься.
Тут надо глобально проблему решать.
Но это хорошо, что пытаешься разобраться)))

Пытался я написать полностью весь алфавит и эффект такой же, к сожалению. Ставлю setlocal и появляется белый экран.
Кстати а базу данных название попадает полное, на почту отправляется без первого слова и на экране тоже отображается без первого слова
 
Последнее редактирование:
Назад
Сверху