4

我的值可能是图像 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)) {}
4

3 回答 3

5

你的意思是你想区分

<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。

于 2013-08-12T15:26:46.073 回答
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 编码的字符串中是不允许的。

于 2013-08-12T15:25:26.330 回答
0

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

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

您也可以使用is_file()which 不会在目录上返回 true。

// if file exists and is a file and not a directory
if (is_file($str)) {}
于 2013-08-12T15:56:59.090 回答