【发布时间】:2015-05-21 19:08:28
【问题描述】:
我有一个正则表达式,旨在检测合理的 Base64 字符串。它适用于https://regex101.com 的所有预期测试值的测试。
~^((?:[a-zA-Z0-9/+]{4})*(?:(?:[a-zA-Z0-9/+]{3}=)|(?:[a-zA-Z0-9/+]{2}==))?)$~
但是,当我在 PHP 中使用这种模式时,我发现一些值会莫名其妙地失败。
$tests = array(
'MFpGQkVBJTNkJTNkfTxCUj4NCg0KICAgIDwvZm9udD4=',
'MFpGRkVBJTNkJTNkfTxCUj4NCg0KICAgIDwvZm9udD4=',
'MFpGSkVBJTNkJTNkfTxCUj4NCg0KICAgIDwvZm9udD4=',
);
foreach ($tests as $str) {
$result = preg_match(
'~^((?:[a-zA-Z0-9/+]{4})*(?:(?:[a-zA-Z0-9/+]{3}=)|(?:[a-zA-Z0-9/+]{2}==))?)$~i',
preg_replace('~[\s\R]~u', "", $str)
);
var_dump($result);
}
结果:
int(1)
int(0)
int(1)
问题:为什么这个模式对于第二个测试字符串会失败?
【问题讨论】:
-
也许你不需要 RegEx :) stackoverflow.com/questions/2556345/… 有一个很好的答案(第二个答案)
-
preg_replace的目的是什么? -
preg_replace消除 base64 块中常见的空白(换行符)。 -
@Marc,我实际上会在有条件解码后进行健全性检查,与此类似,但我也想进行预测试。至关重要的是,我们不会得到误报。