Le quadre non hanno bisogno di esplicitare l'OR. In pratica [1|2]==[12], ma scritto inquesto modo cerca un solo carattere o 1 oppure 2.
Detto questo puoi definire una classe di numeri usando il trattino "-" quindi :
[1|2|3|4|5|6|7|8|9] == [1-9]
Siccome vuoi un range tra 1 e 16 credo che cosė potrebbe funzionare:

codice:
preg_match_all("/\[:(?:1[0-6]|[1-9]):\]/",$testo,$testo1);
echo '<pre>';
print_r($testo1);
per le faccine c'č n comodo checkbox che le disabilita per il singolo messaggio (ammetto che me ne sono accorto solo ora :) )