Исходя из того, что я вижу из вашего примера ввода и желаемого результата, вам не нужны служебные данные preg_replace_callback()
. Предварительный просмотр переменной длины позволит вам заменять один символ за раз звездочкой, если за ним следуют 4 или более цифр или переносов.
Код: ( Демо )
$inputs = [
"John's Mobile number is 8767484343 and he is from usa.",
"John's Mobile number is +918767484343 and he is from india.",
"Sunny's Mobile number is 08767484343 and he is from Pimpri-Chinchwad, india.",
"Rahul's Mobile number is 1800-190-2312 and he is from india."
];
var_export(preg_replace('~[+\d-](?=[\d-]{4})~', '*', $inputs));
Выход:
array (
0 => 'John\'s Mobile number is ******4343 and he is from usa.',
1 => 'John\'s Mobile number is *********4343 and he is from india.',
2 => 'Sunny\'s Mobile number is *******4343 and he is from Pimpri-Chinchwad, india.',
3 => 'Rahul\'s Mobile number is *********2312 and he is from india.',
)
Я мог бы придумать некоторые дополнительные случаи, которые не будут обрабатываться моим фрагментом, но всякий раз, когда вы имеете дело с номером телефона, который не подчиняется строгому формату, вы спускаетесь по кроличьей норе вызовов.