This is the second time I try to fix the preg_match bug with a number 50887. The first time I tried it, less than two months ago, my solution was buggy too, and for this reason I have unpublished it.
There are many different scenarios that I didn’t take into account, but almost all of them were related to How to count expected matches of a PHP regular expression. The rest were essentially the same: I thought that the preg_match bug was affecting just the last optional match. Later I found instead that it affects really all the matches at the end, any number of them, be they optional or not. Due to this little misunderstanding I had to rewrite a big portion of the function.
{[ .fix | 1.hilite(=php=) ]}
For the function ando_preg_count_groups(…) see the post How to count expected matches of a PHP regular expression.
Minimal Tests
The following tests are based on $regex = ‘(?J:(?
.
Test 1a
{[ .test-1a-program | 1.hilite(=php=) ]}
Test 1b
{[ .test-1b-program | 1.hilite(=php=) ]}
Test 1c
{[ .test-1c-program | 1.hilite(=php=) ]}
The following tests are based on $regex = ‘(?|Saturday|Sun(day)?)’;.
Test 2a
{[ .test-2a-program | 1.hilite(=php=) ]}
Test 2b
{[ .test-2b-program | 1.hilite(=php=) ]}
Test 2c
{[ .test-2c-program | 1.hilite(=php=) ]}
The following tests are based on $regex = ‘(?|(Sat)ur(day)|Sun(day)?)’;.
Test 3a
{[ .test-2a-program | 1.hilite(=php=) ]}
Test 3b
{[ .test-2b-program | 1.hilite(=php=) ]}
Test 3c
{[ .test-2c-program | 1.hilite(=php=) ]}