PHP: экранировать имя файла, как это делает Linux - PullRequest
4 голосов
/ 14 февраля 2011

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

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

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

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

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

, чтобы экранировать все, кроме цифр, букв, - и пробелов ... но я обнаружил, что для файла "test_1.jpg" эта команда преобразует его в "test_1.jpg ", и это не работает, поскольку" _ "НЕ нужно преобразовывать.

Боюсь, что может быть больше" разрешенных "символов, поэтому мой вопрос ... как можноя "клонирую" функцию выхода клавиши "tab" в консоли Linux linux?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 16 октября 2013

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

2 голосов
/ 14 февраля 2011

Я использую это как для имен файлов, так и для создания 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);
0 голосов
/ 20 июля 2018

это функция, которую я собрал, надеюсь, она поможет

Вы все можете добавить больше, добавив | с другим экранированным символом

public function linuxFilename($file)
{
    //make the linux filename perfect
    return preg_replace("/ |'|\(|\)/", '\\\${0}', $file);
}
0 голосов
/ 14 февраля 2011

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

...