[php-src] Issue #20589: preg_replace_callback $count number of matches, number of replacements

[email protected] (kkmuffme)
Newsgroups php.bugs
Message-ID <[email protected]>
Issue: https://github.com/php/php-src/issues/20589
Author: kkmuffme

### Description

The following code:

https://3v4l.org/0E8mn#v8.5.0

```php
<?php

$before = 'abca';
$after = preg_replace( '/a/', 'a', $before, -1, $count );
if ( $after === $before ) {
    echo "NO REPLACEMENTS" . PHP_EOL;
}

echo $count . " REPLACEMENTS";
```

Resulted in this output:
```
NO REPLACEMENTS
2 REPLACEMENTS
```

But I expected this output instead:
```
NO REPLACEMENTS
0 REPLACEMENTS
```

https://www.php.net/manual/en/function.preg-replace.php
>If specified, this variable will be filled with the number of replacements done.

Technically, this is correct, since the replacement is identical to the search string.
While for preg_replace this makes practically no difference (except for cases where backslash is incorrectly escaped, you could end up with a preg that says it replaced even though it didn't change the input)

Practically for `preg_replace_callback` this means however, that you always have to compare before/after to be sure whether anything was replaced at all.
And there's no way of knowing how many replacements were actually done.

Changing the behavior should generally be safe I guess, but otherwise just adding an additional param "$replacement_count" for preg_replace_callback would make sense? (so the 1st param docs would be changed to be "number of matches")



### PHP Version

```plain
8.5
```

### Operating System

_No response_
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.