Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442

    ctype_alpha e charset internazionali

    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.

  2. #2
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442

    Risolto...

    Come sempre la notte porta consiglio...

    Alla fine ho risolto facendo varie prove con le espressioni regolari, questa è la funzione che ho scritto e che va con tutti i tipi di carattere esprimibili in UTF-8 (i miei script e le pagine generate sono tutti codificati con questa codifica):

    Codice PHP:
    public function filter($value) {
        
    $value = (string) $value;
        
    // split the input in characters respecting utf8 properties
        
    preg_match_all('/./ux'$value$chars);
        
    $firstchar true;
        
    $output '';
        foreach (
    $chars[0] as $char) {
            if (
    preg_match('/\pL/ux'$char)) {
                if (
    $firstchar) {
                    
    $firstchar false;
                } else if (
    preg_match('/\p{Lu}/ux'$char)) {
                    
    // if is uppercase and not first char in a word, strtolower it
                    
    $char mb_strtolower($charmb_detect_encoding($char));
                }
            } else {
                
    $firstchar true;
            }
            
    // adding to output
            
    $output .= $char;
        }
        return 
    $output;

    E questo è l'output della funzione su una frase con i caratteri più strani che mi siano venuti in mente

    Original value: fràSe Da ñApíLiooÓÃÍ
    Filtered value: fràse Da ñapíliooóãí
    Time to 100000 run: 1.92074 sec.

    Saluti.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.