(实际答案。)不要使用正则表达式。使用解码你的字符串base64_decode() http://php.net/manual/en/function.base64-decode.php是可选的$strict
参数设置为true
并查看它是否符合您期望的格式。或者在允许的情况下尝试多次解码。例如。:
function base64_decode_multiple(string $data, int $count = 2) {
while ($count-- > 0 && ($decoded = base64_decode($data, true)) !== false) {
$data = $decoded;
}
return $data;
}
(理论答案。)双基 64 编码字符串are常规,因为正确对 Base64 编码消息进行 Base64 编码的字节序列数量有限。
您可以检查某些内容是否是 base64 编码的once因为您可以验证每组四个字符。 Base64 编码消息中的最后四个字节可能是一种特殊情况,因为=
s 用作填充。使用正则表达式:
<char> := [A-Za-z0-9+/]
<end-char> := [A-Za-z0-9+/=]
<chunk> := <char>{4}
<end-chunk> := <char>{2} <end-char>{2} | <char>{3} <end-char>
<base64-encoded> := <chunk>* <end-chunk>?
您还可以确定某些内容是否是 base64 编码的twice使用正则表达式,但解决方案并不简单或漂亮,因为一次检查 4 个字节是不够的。
Example:“QUFBQQ==”base64 解码为“AAAA”,base64 解码为三个 NUL 字节:
$ echo -n "QUFBQQ==" | base64 -d | xxd
00000000: 4141 4141 AAAA
$ echo -n "AAAA" | base64 -d | xxd
00000000: 0000 00 ...
此时,我们可以枚举所有双 Base64 编码,其中 Base64 编码为 Base64 字母表中的 4 个字节(“AAAA”、“AAAB”、“AAAC”、“AAAD”等),并将其最小化:
<ugly 4> := QUFBQQ== | QUFBQg== | QUFBQw== | QUFBRA== | ...
我们可以枚举所有双 Base64 编码的前 4 个字节,其中 Base64 编码为 8 字节或更长(不涉及填充的情况)=
)并最小化:
<chunk 4> := QUFB | QkFB | Q0FB | REFB | ...
双 Base64 编码字符串的一个分区(漂亮的分区)将不包含=
s 位于末尾;它们的长度是 8 的倍数:
<pretty double-base64-encoded> := <chunk 4>{2}*
双 Base64 编码字符串的另一个分区的长度是 4 的倍数但不是 8(4、12、20 等);它们可以被认为是漂亮的,但最后却有一点丑陋:
<ugly double-base64-encoded> := <chunk 4>{2}* <ugly 4>
然后我们可以构造一个组合的正则表达式:
<double-base64-encoded> := <pretty double-base64-encoded>
| <ugly double-base64-encoded>
正如我所说,您可能不想仅仅因为双 Base64 编码消息而经历所有这些混乱are常规的。就像您不想检查整数是否在某个有限区间内一样。另外,这是一个很好的例子,当你应该问另一个问题时却得到了错误的答案。 :-)