per i posteri (salvo revisioni).. ecco il risultato funzionante!
ho fatto qualche minima modifica, e cambiato i nomi alle variabili per essere un po' più esplicativi per un niubbo come me, ma ovviamente il 99% del merito è di eiyen, thanks a thousand! 
Codice PHP:
<?php
$testo_noimg = "Nel mezzo del cammin di nostra vita {IMG::12::right} mi ritrovai per una selva oscura {IMG::2::left}"; // (contiene il template) per esempio con {IMG::25::right}
$ph_in = '{IMG::'; // marcatore di fine
$ph_in_len = strlen($ph_in); // lunghezza marcatore di inizio
$ph_out = "}"; // marcatore di fine
$ph_out_len = strlen($ph_out); // lunghezza marcatore di fine
echo "
testo_noimg = " . $testo_noimg;
while($ph_in_pos !== false) {$ph_in_pos = strpos($testo_noimg, $ph_in); // posizione del placeholder
if ($ph_in_pos !== false) { // echo "
ph_in_pos = " . $ph_in_pos;
$ph_in_pos = strpos($testo_noimg, $ph_in); // posizione del placeholder
$ph_out_pos = strpos($testo_noimg, $ph_out); // echo "
ph_out_pos = " . $ph_out_pos;
$ph_lungh = $ph_out_pos-$ph_in_pos; // echo "
ph_lungh = " . $ph_lungh;
$ph = substr ($testo_noimg,$ph_in_pos,$ph_lungh+$ph_out_len); // echo "
ph = " . $ph;
$pars = substr ($testo_noimg,$ph_in_pos+$ph_in_len,$ph_lungh-$ph_in_len); // echo "
pars = " . $pars;
list($id,$pos) = explode('::',$pars); // echo "
id = " . $id; echo "
pos = " . $pos;
$ph_tag = "img_id=$id e img_pos=$pos";
};
$testo_noimg = str_replace($ph,$ph_tag,$testo_noimg);
};
echo "
testo_img = " . $testo_noimg;
?>
Eseguendo lo script:
testo_noimg = Nel mezzo del cammin di nostra vita {IMG::12::right} mi ritrovai per una selva oscura {IMG::2::left}
testo_img = Nel mezzo del cammin di nostra vita img_id=122 e img_pos=right mi ritrovai per una selva oscura img_id=2 e img_pos=left