проверка — проверьте, может ли строка быть путем в переполнении стека

Когда я использую file_get_contents, is_file, realpath, file_exists со строкой, которая не является путем, я получаю следующее предупреждение.

«function_name ()» ожидает, что параметр 1 будет правильным путем, строка задана в […]

Итак, как определить, может ли строка быть допустимым путем или нет.


Какого черта ты хочешь сделать? Вы можете спросить …

Ну, я хочу создать такую ​​функцию.

funtion my_smart_function( string $path_or_content )
{
$content = is_file_without_warning_if_not_a_valid_path( $path_or_content )
? file_get_contents( $path_or_content )
:                    $path_or_content;
// do nice stuff with my $content
}

Иногда $path_or_content будет действительный путь к файлу, а иногда $path_or_content будет сам по себе содержимым файла (например, двоичные данные изображения, созданного на лету, который даже не имеет пути (по крайней мере, пока)). В последнем случае все эти функции, связанные со строками, я упоминал выше (например, file_exists()) выдаст предупреждение (см. цитату выше).


Что-то мне интересно.
realpath('xyz') не выдает предупреждение, но
realpath( file_get_contents('path/to/actual/image.jpg') ) делает …

Так realpath и другие функции, упомянутые выше, различают строка или строка, которая является допустимым путем. Так как же мы можем сделать это заранее?


Спасибо заранее!

4

Решение

Это может быть разумным временем для использования @ модификатор для подавления ошибок.

funtion my_smart_function( string $path_or_content )
{
$content =      @file_exists( $path_or_content )
? file_get_contents( $path_or_content )
:                    $path_or_content;
}

Если это не правильный путь, file_exists() вернусь falseи @ будет держать его от жалоб на плохую строку.

В Linux единственным символом, который не разрешен в пути, является нулевой байт. Так что вы можете просто проверить это:

if (strpos($path_or_contents, "\0") === false) {
return file_get_contents($path_or_contents);
} else {
return $path_or_contents;
}
3

Другие решения

Я считаю, что это именно то, что вы хотите. ctype_print проверяет, все ли символы в предоставленной строке, пригодны для печати. Если так, передайте это file_exists,

function my_smart_function( $path_or_content )
{

$content = ctype_print($path_or_content) && file_exists( $path_or_content )
? file_get_contents( $path_or_content )
:                    $path_or_content;

// do nice stuff with my $content
}
3

Я думаю, что вы пропустили Файл существует функция. Из документации:

file_exists — проверяет, существует ли файл или каталог

bool file_exists ( string $filename )

Возвращает TRUE, если файл или каталог, указанный в filename, существует;
ЛОЖЬ в противном случае.

2
По вопросам рекламы [email protected]