Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Conversione stringa in stile permalink

    Salve a tutti,
    mi sto battendo nella creazione di uno scriptino stupido che serve solo a prendere il titolo di una news per convertirlo in stile permalink, ovvero cambiando spazi in trattini, togliendo gli eventuali accenti alle vocali ed eliminando gli apostrofi.

    Questa funzione in stile permalink serve a creare il codice della news che si sta creando, che corrisponderà alla chiave primaria nel database.

    Il codice che ho scritto è questo:
    Codice PHP:
        static function encodeTitle($title) {
            
    //$accentate = array("à", "è", "é", "ì", "ò", "ù");
            //$vocali = array("a", "e", "e", "i", "o", "u");
            //$encoded = str_ireplace($accentate, $vocali, $title);
            
    $encoded strtr($title,"àèéìòù","aeeiou");
            
    $encoded ereg_replace("[^[:space:]a-zA-Z0-9]"""$encoded);
            
    $encoded str_replace(" ""-"$encoded);
            return 
    $encoded;
        } 
    le tre righe commentate rappresentano una alternativa alla funzione strstr().

    Il problema di questo script sta proprio nella conversione delle lettere accentate con le rispettive vocali; sembra che proprio non riesca a pescare le lettere accentate dalla stringa, non le vede proprio...

    Se qualcuno ha idea di come risolvere la questione ne sarei molto grato!! Sto lavorando su un progettino per la tesi e mi sono infangato su questo piccolo scriptino.....

  2. #2
    Nei commenti alla documentazione di PHP un utente ha detto:
    If you try to make a strtr of not usual charafters when you are in a utf8 enviroment, you can do that:

    function normaliza ($string){
    $string = utf8_decode($string);
    $string = strtr($string, utf8_decode(" ÂÊÎÔÛÀ"), "-AEIOU");
    $string = strtolower($string);
    return $string;
    }
    Prova a vedere se è il tuo caso

  3. #3
    Non funziona neanche così...

    Un amico GURU di PHP ha consigliato:
    Codice PHP:
    static function encodeTitle($title) {
            
    $encoded iconv('UTF-8''ASCII//TRANSLIT'$title);
            
    $encoded str_replace(" ""-"$encoded);
            
    $encoded ereg_replace("[^[:space:]a-zA-Z0-9-]"""$encoded);
            
    $encoded strtolower($encoded);
            return 
    $encoded;
        } 
    ...ed effettivamente funziona alla perfezione!

    Il trucco sta nella funzione iconv che si occupa lui della conversione delle accentate!

  4. #4
    a quale scopo tenere iconv per semplicemente sistemare le lettere accentate? se usi un charset non UTF8 non hai necessità di iconv, ti basta fare un semplice str_replace o strtr

    inoltre a quale scopo dichiarare la funzione statica?

    codice:
    function encodeTitle($title)
    {
        $encoded = strtr(array
        (
            '-' => ' ',
            'à' => 'a',
            'è' => 'e',
            'ì' => 'i',
            'ò' => 'o',
            'ù' => 'u',
        ), $title);
        $encoded = preg_replace('#[^a-z0-9-]#i', '', $encoded);
        $encoded = strtolower($encoded);
        return $encoded;
    }
    fatto questo ci sarebbe anche la necessità di sostiturie più trattini con uno solo ... quindi

    codice:
    function encodeTitle($title)
    {
        $encoded = strtr(array
        (
            '-' => ' ',
            'à' => 'a',
            'è' => 'e',
            'ì' => 'i',
            'ò' => 'o',
            'ù' => 'u',
        ), $title);
        $encoded = preg_replace('#[^a-z0-9-]#i', '', $encoded);
        $encoded = preg_replace('#-+#', '-', $encoded);
        $encoded = strtolower($encoded);
    
        return $encoded;
    }
    non l'ho provato, sono a casa di un amico, non ho l'ambiente AMP in ogni caso il risultato dovrebbe essere lo stesso senza però utilizzare iconv, soprattutto perché quella funzione dipende dal "locale" utilizzato sulla macchina: magari sposti tutto su un altro server o in un altro ambiente e rischi di ritrovarti svariati casini qua e la

    http://it.php.net/manual/it/function.iconv.php#77315
    http://it.php.net/manual/it/function.iconv.php#74101
    http://it.php.net/manual/it/function.iconv.php#83238

    e cosi via se cerchi nei commenti

  5. #5
    Il codice che ho provato:
    Codice PHP:
    static function encodeTitle($title) {
        
    $encoded strtr($title, array(' ' => '-''à' => 'a''è' => 'e''é' => 'e''ì' => 'i''ò' => 'o''ù' => 'u'));
        
    $encoded preg_replace('#[^a-z0-9-]#i'''$encoded);
        
    $encoded strtolower($encoded);
        return 
    $encoded;

    Non funziona neanche così, o meglio non funziona la sostituzione delle accentate (la conversione spazio=>trattino va a buon fine...).
    Continua a non trovare le lettere accentate dentro la stringa di ricerca. Ho provato anche con la funzione utf8_decode(), ma nulla da fare.

    La funzione la dichiaro statica perché non sta dentro ad una classe istanziabile. Ho creato una classe astratta "Utils" con dentro metodi statici invece di includere un file functions.php

  6. #6
    che codifica usi per le pagine?

  7. #7
    UTF-8.

    Giacché ci sono ti chiedo un altro parere: secondo te è bene cercare di memorizzare nel database le lettere accentate così come sono per poi convertirle nelle rispettive entità HTML con htmlspecialchars() o htmlentities(), oppure pensi sia meglio convertire subito prima della memorizzazione in modo da conservare le entità HTML sul DB?

    Per adesso ho implementato nel primo modo, ed in locale funziona benissimo; nel DB ho tutte lettere accentate, le prelevo e le codifico in entità HTML. Tutto funziona alla perfezione, ma sul server remoto dove sto testando il sito sembrano esserci problemi con codifica/decodifica...

  8. #8
    Originariamente inviato da AbbiWeb
    UTF-8.

    Giacché ci sono ti chiedo un altro parere: secondo te è bene cercare di memorizzare nel database le lettere accentate così come sono per poi convertirle nelle rispettive entità HTML con htmlspecialchars() o htmlentities(), oppure pensi sia meglio convertire subito prima della memorizzazione in modo da conservare le entità HTML sul DB?

    Per adesso ho implementato nel primo modo, ed in locale funziona benissimo; nel DB ho tutte lettere accentate, le prelevo e le codifico in entità HTML. Tutto funziona alla perfezione, ma sul server remoto dove sto testando il sito sembrano esserci problemi con codifica/decodifica...
    ecco, la cosa cambia considerevolmente: usando UTF-8, che da php non è nativamente gestito, i caratteri accentati sono composti in realtà da due byte che per php sono due ben distinti caratteri a se stanti

    anche usando htmlentities o htmlspecialchars, se non specifici il charset, avrai problemi, probabilmente maggiori, perché convertiranno le varie parti del carattere in entità a se stanti.

    il primo modo funziona perché converti da UTF-8 ad ASCII

    prova con
    codice:
    static function encodeTitle($title) {
        $encoded = strtr(utf8_decode($title), array(' ' => '-', 'à' => 'a', 'è' => 'e', 'é' => 'e', 'ì' => 'i', 'ò' => 'o', 'ù' => 'u'));
        $encoded = preg_replace('#[^a-z0-9-]#i', '', $encoded);
        $encoded = strtolower($encoded);
        return $encoded;
    }
    sul sito remoto, sembrano esserci problemi di codifica, perché non la gestisci correttamente

    ad esempio: dove specifichi che la connessione è di tipo UTF-8? altra domanda la imposti nella connessione al database? o ancora ... effettui operazioni sulle stringhe ricevute dal browser (operazioni di qualsiasi genere come ad es conversione a caratteri maiuscoli o minuscoli, tagli, lettura di spezzoni e cosi via)?

  9. #9
    Originariamente inviato da daniele_dll
    prova con
    codice:
    static function encodeTitle($title) {
        $encoded = strtr(utf8_decode($title), array(' ' => '-', 'à' => 'a', 'è' => 'e', 'é' => 'e', 'ì' => 'i', 'ò' => 'o', 'ù' => 'u'));
        $encoded = preg_replace('#[^a-z0-9-]#i', '', $encoded);
        $encoded = strtolower($encoded);
        return $encoded;
    }
    già provato ma non cambia nulla...

    dove specifichi che la connessione è di tipo UTF-8?
    nel documento HTML
    codice:
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    altra domanda la imposti nella connessione al database?
    No, quando faccio operazioni, sia di lettura che di scrittura, non imposto alcun charset...dovrei? Il database l'ho creato impostando come collation utf8_unicode_ci.

    o ancora ... effettui operazioni sulle stringhe ricevute dal browser (operazioni di qualsiasi genere come ad es conversione a caratteri maiuscoli o minuscoli, tagli, lettura di spezzoni e cosi via)?
    No, nessuna manipolazione di HTTP Response o quantaltro...le uniche cose che uso che centrano con i messaggi HTTP sono ob_start() e session_start().

  10. #10
    beh, si, è abbastanza importante specificare il charset della connessione

    cerca su google
    SET NAMES

    e
    SET CHARACTER SET

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 © 2024 vBulletin Solutions, Inc. All rights reserved.