Ottimo ntd, mi hai illuminato sulla questione spazi... era quella che mi aveva fatto pensare ad un ordine che in realtà non c'entra nulla.

Effettivamente con una cosa tipo

codice:
preg_match('/^[a-zA-Z0-9 \?\']*$/', $stringa);
(nota lo spazio tra il 9 e il \?) funziona, anche se è veramente di dubbio stile