如何在PHP中检查它是否是普通的字符串或二进制字符串?

时间:2011-08-22 10:33:17

标签: php string

  

可能重复:
  How to Check if File is ASCII or Binary in PHP

我的函数接受图像文件的名称(即普通字符串),或者它可以直接接受图像字节作为二进制字符串。由file_get_contents返回。

我如何区分这两者?

2 个答案:

答案 0 :(得分:15)

您可以检查输入是否仅由可打印字符组成。你可以用ctype_print():

来做到这一点
if (ctype_print($filename)) { // this is most probably not an image

您还可以检查参数是否是有效图像,或者是否存在具有该名称的文件。

然而,创建两个单独的函数会更好,更可靠:

  • 一个load_image_from_string(),它总是将图像作为参数
  • 和一个load_image_from_file(),它将读取文件并调用load_image_from_string()

答案 1 :(得分:1)

在PHP中,所有字符串都是二进制的(截至当前的PHP 5.3),因此无法区分。因此,您无法区分参数是二进制数据还是技术上的文件名(字符串或字符串)。

但是,您可以创建第二个函数来处理重新使用处理图像数据的函数的文件。因此函数的名称清楚地表明了它所期望的参数。


如果您需要根据作为参数传递给函数的类型来决定,则必须向数据添加上下文。一种方法是制作某种类型的参数:

abstract class TypedString
{
    private $string;
    public final function __construct($string)
    {
        $this->string = (string) $string;
    }
    public final function __toString()
    {
        return $this->string;
    }
}

class FilenameString extends TypedString {}

class ImageDataString extends TypedString {}


function my_image_load(TypedString $string)
{
    if ($string instanceof FilenameString)
    {
        $image = my_image_load_file($string);
    }
    elseif ($string instanceof ImageDataString)
    {
        $image = my_image_load_data($string);
    }
    else
    {
         throw new Exception('Invalid Input');
    }
    # continue loading the image if needed
}
function my_image_load_file($filename)
{
    # load the image from file and return it
}
function my_image_load_data($data)
{
    # load the image from data and return it
}

但是我认为更容易处理正确的命名函数,否则如果你只使用 类型区分类,你就会使事情变得不必要复杂。