PHP: escape filename как linux делает

У меня возникают проблемы с загрузкой файлов пользователями, которые я должен обработать. Когда я пытаюсь получить к ним доступ, потому что некоторые из них имеют специальные символы, используемая команда говорит, что файл не найден или подобен.

Я использовал escapeshellcmd без успеха.

Когда я использую ключ «tab» в консоли linux (когда вы начали вводить имя файла и хотите его заполнить), bash правильно удалит имя файла, и если я использую именно это «экранированное» имя файла, оно работает.

Я пробовал это:

preg_replace("/[^a-zA-Z0-9\-\.\s]/", "\\\\$0", $filename) 

чтобы избежать всех, кроме цифр, букв, и пробелов … но я обнаружил, что для файла «test_1.jpg» эта команда преобразует его в «test_1.jpg», и это не работает, поскольку «_» НЕОБХОДИМО для преобразования.

Я боюсь, что могут быть более «разрешенные» символы, поэтому мой вопрос … как я могу «клонировать» функцию эвакуации клавиши «tab» в консоли basux linux?

Спасибо !

Я использую это как для имен файлов, так и для URL-адресов из заголовков сообщений в блогах и т. П.

 // everything to lower and no spaces begin or end $path = strtolower(trim($path)); // adding - for spaces and union characters $find = array(' ', '&', '\r\n', '\n', '+',','); $path = str_replace ($find, '-', $path); //delete and replace rest of special chars $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/'); $repl = array('', '-', ''); $path = preg_replace ($find, $repl, $path); 

Если вы хотите использовать имя файла в качестве параметра команды оболочки, вы можете использовать функцию escapeshellarg .

Если вы обращаетесь к этим файлам непосредственно на своем веб-сервере, имена ваших файлов должны быть закодированы url с помощью urlencode, а не escapeshellcmd