确定值是base64字符串还是图像URL的最佳方法是什么?

时间:2013-08-12 15:15:21

标签: php base64

我有一个值,可能是图像URL或图像Base64字符串。确定哪个是哪个最好的方法是什么?如果是图像URL,则图像将已驻留在我的服务器上。

我尝试过做一个preg_match,但我认为在一个可能很大的base64字符串上运行preg_match将是服务器密集的。

编辑:迄今为止最好的两种方法。

// if not base64 URL
if (substr($str, 0, 5) !== 'data:') {}

// if file exists
if (file_exists($str)) {}

3 个答案:

答案 0 :(得分:4)

你的意思是你要区分

<img src="http://example.com/kittens.jpg" />
and
<img src="data:image/png;base64,...." />

你只需要查看src属性的前5个字符就可以确定它是否是数据uri,例如。

if (substr($src, 0, 5) == 'data:')) {
    ... got a data uri ...
}

如果它看起来不像数据uri,那么可以安全地假设它是一个URL并将其视为一个URL。

答案 1 :(得分:0)

如果这只是两种可能性,你可以这样做:

$string = 'xxx';
$part = substr($string, 0, 6); //if an image, it will extract upto http(s):

if(strstr($part, ':')) {
    //image
} else {
    //not an image
}

说明:以上代码假定输入是base64字符串或图像。如果它是图像,它将并且应该包含协议信息(包括:)。在base64编码的字符串中不允许这样做。

答案 2 :(得分:0)

您可以使用preg_match()执行此操作。当preg_match看不到d时,代码将停止。如果发现d后面没有a,它将会停止,依此类推。这样你就不会做多余的数学和字符串解析:

if(!preg_match('!^data\:!',$str) {
  //image
} else {
  //stream
}

您也可以使用is_file(),它不会在目录中返回true。

// if file exists and is a file and not a directory
if (is_file($str)) {}