Pues no, nada raro, sencillamente hacías cosas de más, trucos chinos y no se que tantos hacks para intentar darle la vuelta a algo muy simple.
Básicamente estabas usando código sin razón ni beneficio alguno:
Código PHP:
Ver original<?php
$subject = '$color.name';
// use($subject) es innecesario
$callback = function($matches) {
/* todo esto es innecesario...
$callback2 = function($groups) use ($matches) {
$match = $matches[$groups[1]]; // $groups[1] devuelve el '1' de '$1'
// por tanto seria $matches[1]
// equivalente a 'name' (sin el punto)
return str_replace( // duevuelvo '["name"]' para $replaced
$groups[0], // esto tomaria cada uno de los $1 $2 encontrados..
$match, // seria 'name'
'["$1"]' // se reemplaza '$1' por 'name'
);
};
$replaced = preg_replace_callback( // consigo '["name"]'
'@\$([0-9]{1,2})@i', // busca los $1 $2 $3 etc.. que uno ponga
$callback2, // llama a $callback2
'["$1"]' // $1 deberia ser remplazado por 'name'
);*/
// esto esta mal, tu no debes hacer ningun reemplazo,
// debes dejar que preg_replace_callback haga su trabajo...
/*
return str_replace( // finalmente se reemplaza todo
$matches[0], // esto es ".name"
$replaced, // esto es '["name"]'
$subject // esto es '$color.name'
);
*/
// $matches[1] es "name"
return '["' . $matches[1] . '"]';
};
'@\.([a-z_]+)@i', // busca los ".algo" en este caso ".name"
$callback, // llama a $callback
$subject // string = '$color.name'
);
echo "<br>handed replaced: " . $subject;
Lee bien tu código y verás que siempre hiciste mal todo.
Y todo eso ocurre por no leer el manual.