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