Skip to content

preg_replace_callback $count number of matches, number of replacements #20589

@kkmuffme

Description

@kkmuffme

Description

The following code:

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

<?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

8.5

Operating System

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions