检测字符串是否为二进制

时间:2014-08-16 20:09:25

标签: php

如何确定字符串是否包含不可打印的字符/可能是二进制数据?

这是用于单元测试/调试 - 它不需要精确。

7 个答案:

答案 0 :(得分:6)

这必须这样做。

function isBinary($str) {
    return preg_match('~[^\x20-\x7E\t\r\n]~', $str) > 0;
}

答案 1 :(得分:2)

来自 Symfony 数据库调试工具:

if (!preg_match('//u', $params[$index])) // the string is binary

检测字符串是否包含非 Unicode 字符。

答案 2 :(得分:0)

要搜索不可打印的字符,您可以使用ctype_printhttp://php.net/manual/en/function.ctype-print.php)。

答案 3 :(得分:0)

一个hacky解决方案(我经常看到)会搜索NUL \0字符。

if (strpos($string, "\0")===FALSE) echo "not binary";

更复杂的方法是检查字符串是否包含有效的unicode。

答案 4 :(得分:0)

尝试使用reg exp替换,替换' [:print:]'使用"",如果结果为""然后它只包含可打印的字符,否则它也包含不可打印的字符。

答案 5 :(得分:0)

我将使用一个简单的ctype_print。它对我有用:

public function is_binary(string $string):bool
{
    if(!ctype_print($string)){
        return true;
    }

    return false
}

答案 6 :(得分:0)

我的假设是OP要做的事情如下:

$hex = hex2bin(“0588196d706c65206865782064617461”);
// how to determine if $hex is a BINARY string or a CHARACTER string?

是的,这是不可能的。让我们看看为什么:

$string = “1234”

二进制形式为31323334。猜猜您执行以下操作会得到什么?

hex2bin(‘31323334’) == ‘1234’

您得到true。但是等等,您可能会说,我指定了BINARY,它应该是BINARY 0x31 0x32 0x33 0x34!是的,但是PHP不知道区别。您知道其中的区别,但是PHP如何解决这个问题?

如果出于某种原因要测试不可打印,那是完全不同的。但是,任何数量的Regex伏都教徒都不会让代码神奇地知道您想将其视为二进制字符串。