Salve a tutti, ho la necessità di scrivere una funzione che trasformi una frase secondo la seguente regola:

Ogni parola della frase può contenere maiuscole solo nella prima posizione, ovvero 'Fabio' è una parola legale mentre 'fAbio' non lo è e va trasformata in 'fabio'.

Per il resto la frase non deve subire trasformazioni, ovvero deve mantenere la stessa spaziatura e punteggiatura ed eventuali altri simboli in essa contenuta.

La mia idea era di fare un ciclo sui caratteri della frase e trasformare i caratteri maiuscoli che non si trovano all'inizio di una parola, quindi più o meno così:


Codice PHP:
public function filter($value) {
    
$value = (string) $value;
    
$length strlen($value);
    
$firstchar true;
    for (
$i 0$i $length$i++) {
        if (
ctype_alpha($value[$i])) {
            if (
$firstchar) {
                
$firstchar false;
            } else {
                
$value[$i] = strtolower($value[$i]);
            }
        } else {
            
$firstchar true;
        }
    }
    return 
$value;

e la cosa funziona bene fino a quando non vengono usati nella frase caratteri non standard, infatti ho problemi ad esempio con le accentate, e la funzione non trasforma 'fràSe Da TrasfòRmare', mentre agisce correttamente su 'fraSe Da TrasfoRmare'.

Tutto questo perché la funzione ctype_alpha ritorna false sui caratteri non ascii, nonostante io abbia impostato il locale su it_IT.utf8 mediante la funzione setlocale.

Inoltre in questo esempio uso una frase in italiano, ma la funzione va impiegata in uno script che prende input anche in altre lingue come francese, spagnolo e tedesco, quindi posso incontrare caratteri come ß, ñ, etc.

Che funzione posso usare in alternativa alla ctype_alpha per verificare se un carattere è alfabetico oppure no? Oppure qualcuno ha qualche soluzione alternativa?

Grazie per le risposte.