So this happened. Basically the first regex causes preg_match to fail when it tries to process 128KiB ASCII zeros… and 128KiB isn’t really that many zeros. Fortunately the second regex performs much better, PHP runs out of memory before preg_match chokes on that one.
------------------- Sat Apr 01 13:17:17 [bash:5.1.16 jobs:0 error:0 time:243] jj5@charm:/home/jj5/desktop/experiment $ cat base64-regex.php <?php test( '/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$/' ); test( '/^[a-zA-Z0-9\/+]{2,}={0,2}$/' ); function test( $regex ) { echo "testing: $regex\n"; $n = 0; for ( ;; ) { $n++; echo "n: $n\n"; $string = str_repeat( '0', pow( 2, $n ) ); $base64 = base64_encode( $string ); if ( preg_match( $regex, $base64 ) ) { continue; } echo "error at N = $n.\n"; return; } } ------------------- Sat Apr 01 13:17:21 [bash:5.1.16 jobs:0 error:0 time:247] jj5@charm:/home/jj5/desktop/experiment $ php base64-regex.php testing: /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$/ n: 1 n: 2 n: 3 n: 4 n: 5 n: 6 n: 7 n: 8 n: 9 n: 10 n: 11 n: 12 n: 13 n: 14 n: 15 n: 16 n: 17 error at N = 17. testing: /^[a-zA-Z0-9\/+]{2,}={0,2}$/ n: 1 n: 2 n: 3 n: 4 n: 5 n: 6 n: 7 n: 8 n: 9 n: 10 n: 11 n: 12 n: 13 n: 14 n: 15 n: 16 n: 17 n: 18 n: 19 n: 20 n: 21 n: 22 n: 23 n: 24 n: 25 n: 26 n: 27 n: 28 n: 29 n: 30 n: 31 n: 32 n: 33 n: 34 n: 35 Killed ------------------- Sat Apr 01 13:18:21 [bash:5.1.16 jobs:0 error:137 time:307]