Son yazıyı görmemiştim bende şöyle bi regex yazdım üç aşağı beş yukarı aynı
(.{16})21(.{12})17(.{6})10(.*)
http://regex101.com/r/nN5yS5/1
Bir ufak detay sizin kodda eğer içinde 21 vs.. varsa sorun çıkartacaktır bilginize,
bu arada bu sabit uzunluktaysa regex yerine substr daha mantıklı.
bi de sadece bu rakamlardan bölecekseniz
preg_split("%21|17|10%",$deger)
şeklinde de arraya alabilirsiniz.