Le espressioni regolari all'interno delle quadre non hanno ordine: il problema lo hai da qualche altra parte. Ho provato la tua espressione e a me funziona correttamente (tieni presente che non trova le "parole", ma le "linee" di testo che corrispondono, perché ^ e $ indicano inizio e fine dell'area di ricerca, solitamente la linea):

codice:
$stringhe = array(
    'Provasenzaspazi',
    'Prova con spazi',
    '?\\'',
    '\\'?');

foreach ($stringhe as $stringa) {
    $trovate = preg_match('/^[a-zA-Z0-9\?\\']*$/', $stringa);
    echo "$stringa: $trovate\n";
}
Con quanto sopra ho ottenuto il risultato aspettato:

codice:
Provasenzaspazi: 1
Prova con spazi: 0
?': 1
'?: 1