Con la funzione preg_match verrà creato un array dove il primo elemento è l'intero criterio di ricerca, successivamente le sotto regole iniziando da sinistra a destra..
Il tuo pattern già funziona ma comunque ho raggruppato il tutto per l'iniziale "Vi" e non rendo visibile questa cattura "?:"..
Codice PHP:
<?php
$pattern = '#Spett.le(.+)(?:Vi(?:a S\\.|ale|a|iale|co)|Salita|Primo|VIA)(?:.+)#s';
$subject = 'Spett.le
Testo da prelevare (nome / cognome)
Via (C.I.)';
preg_match($pattern, $subject, $matches);
print_r($matches);
//print_r($matches[1]);
?>
Va ripulito dagli spazi bianchi il risultato ottenuto.