- preg_replace: documentation ( source)
<?php
$hash = '4dff4ea340f0a823f15d3f4f01ab62eae05da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a';
//^ Indica o inicio do texto
//(.{n}) Captura os próximos n caracteres.
//(.+)$ Captura os caracteres restantes até o final do texto.
$pattern = '/^(.{8})(.{4})(.{4})(.{4})(.+)$/';
// $n.. representa cada um dos grupos entre parenteses, onde n indica a posição do grupo no $pattern.
$replacement = '$1-$2-$3-$4-$5';
$masked = preg_replace($pattern, $replacement, $hash);
echo $masked;