public static function insert($str, $data, $options = [])
{
$options += ['before' => '{:', 'after' => '}', 'escape' => '\\', 'clean' => false];
extract($options);
$begin = $escape ? '(?<!' . preg_quote($escape) . ')' . preg_quote($before) : preg_quote($before);
$end = preg_quote($options['after']);
foreach ($data as $placeholder => $val) {
$val = is_array($val) || is_resource($val) || $val instanceof Closure ? '' : $val;
$val = is_object($val) && !method_exists($val, '__toString') ? '' : (string) $val;
$str = preg_replace('/' . $begin . $placeholder . $end . '/', $val, $str);
}
if ($escape) {
$str = preg_replace('/' . preg_quote($escape) . preg_quote($before) . '/', $before, $str);
}
return $options['clean'] ? static::clean($str, $options) : $str;
}