я знаю, что прибегаю к очень старому вопросу, и я попробовал все предложенные методы;я наконец получаю это регулярное выражение, которое охватывает почти все мои случаи:
$decoded = base64_decode($string, true);
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
в основном я проверяю каждый символ, который не может быть напечатан (: graph :) не является пробелом или табуляцией (\ s) иэто не юникодная буква (все акценты, например, èéùìà и т.Я объединяю эту проверку с функцией, предложенной @ merlucin
, так что результат:
function is_base64($s)
{
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false;
// Decode the string in strict mode and check the results
$decoded = base64_decode($s, true);
if(false === $decoded) return false;
// if string returned contains not printable chars
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
// Encode the string again
if(base64_encode($decoded) != $s) return false;
return true;
}