У меня есть такой код:
$value = 'daryaa-manmarziyan-(VideoStatus.Net).mp4';
$final_value = preg_replace("/[^a-zA-Z0-9_.]/", "", $value);
echo $final_value; exit();
Выход: daryaamanmarziyanVideoStatus.Net.mp4
Я хочу вывод daryaamanmarziyanVideoStatusNet.mp4
Все ненужные точки (.) Будут удалены. Что мне делать?
Всегда ли жестко запрограммировано имя файла? Или это просто пример и может ли имя файла быть чем угодно? По первому .. Решение должно быть очевидным .. Второе интереснее.
Имя файла @Loek будет все время разным .. У меня просто проблема во время тестирования, но мне нужно решение.






Измените свой вызов preg_replace на это:
$final_value = preg_replace(array("/[^a-zA-Z0-9_.]/", "/\.(?=.*\.)/"), "", $value);
Вторая строка замены (/\.(?=.*\.)/) ищет ., за которым следует другой ., и заменяет его пустой строкой.
Вывод для ваших данных образца:
daryaamanmarziyanVideoStatusNet.mp4
Используйте регулярное выражение с чередованием:
preg_replace("/[^\w.]+|\.(?=[^.]*\.)/", "", $value);
^^^^^^^^^^^^^^
См. Демо PHP онлайн и онлайн-демонстрация регулярного выражения.
Шаблон \.(?=[^.]*\.) соответствует любому . с \., за которым следуют любые символы 0+, кроме ., за которыми следует ..
Кроме того, [A-Za-z0-9_] равен \w, если вы не используете модификатор u, поэтому вы можете немного сократить шаблон.
Подробности
[^\w.]+ - 1 или более символов, кроме символов слова (A-Za-z0-9_) и .| - или\. - точка ...(?=[^.]*\.) - (положительный просмотр вперед, который сразу справа от текущего местоположения гарантирует наличие точки), за которым следует
[^.]* - 0+ символов, кроме .\. - точка.Вы должны использовать
$value = 'daryaa-manmarziyan-(VideoStatus.Net).mp4';
$fileNames = preg_replace(array("/[^a-zA-Z0-9_.]/", "/\.(?=.*\.)/"), "", $fileName);
echo $final_value; exit();
Выход придет
daryaamanmarziyanVideoStatusNet.mp4
В вашем регулярном выражении удалите
., но это приведет к удалению всех точек, включая ту, которая была перед включением mp4