PHP preg_match regex fail

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]

Arrays in PHP

Some notes about arrays in PHP over here: PHP: Frankenstein arrays. I was already aware of most of that but I thought the notes at the bottom about supporting JSON were handy:
If you want to enforce an array to encode to a JSON list (all array keys will be discarded), use:

json_encode(array_values($array));

And if you want to enforce an array to encode to a JSON object, use:

json_encode((object)$array);

Also array_is_list is available as of PHP 8.1.