• User

    Ciao Pastikka,
    inserirò la tua features nella prossima versione di Wik-IT.

    Grazie per il consiglio,
    STEVEN 😉


  • User

    Davvero un ottimo lavoro Steven, complimenti.. me lo studierò per benino, grazie!


  • Super User

    @stevenworks said:

    Ciao Pastikka,
    inserirò la tua features nella prossima versione di Wik-IT.

    Grazie per il consiglio,
    STEVEN 😉

    Di cosa? Più che altro complimenti a te per il lavoro che stai facendo!!

    Ma la nuova features è esportabile anche ad altri progetti? Tipo la potrei utilizzare ancheio per un mio lavoro?


  • User

    🙂 Grazie x i complimenti!

    Purtroppo in questo periodo il provider da cui ho acquistato il sito (digitalvisionhosting) fa un pò i capricci. Si vede che è un periodo che hanno qualche problema.

    Ma la nuova features è esportabile anche ad altri progetti? Tipo la potrei utilizzare ancheio per un mio lavoro?

    Senti, io ho fatto tutto in PHP e, a essere sincero, non sono un grande esperto di questo linguaggio; me la cavo giusto perché sono molti anni che programmo e quindi ho un pochino di dimestichezza con tutti i linguaggi di programmazione. Alla fine, uso sempre i soliti comandi. E' anche vero che il mio progetto Wik-IT non richiede chissà quali comandi.

    Perciò, al limitie, posto qui lo script php. Però devi sapere "aggeggiare" con questo linguaggio.

    STEVEN


  • Super User

    Ciao STEVEN,

    anche io non sono un guru del php ma ho molti siti realizzati con questo linguaggio di scripting lato server. Quindi, se posti il codice qui, penso di poter provare ad adattarlo...

    Ciao e grazie


  • User

    Eccomi,
    ho aggiornato Wik-IT alla versione 1.8 con una funzione che ho chiamato semplicemente Link Automatici.

    Dunque, questo è il sisitema che ho adottato io. Non è il migliore, ma è per Wik-IT quello più adatto.

    Innanzi tutto, si parte da un file di testo che contiene l'elenco dei comandi, dove ogni comando è una riga composta da:

    • parola da convertire in link
    • pagina da aprire quando uno clicca sul link
    • destinazione, ovvero la pagina stessa (_parent) o in una nuova pagina (_blank).
      Queste 3 info devono essere separate dalla pipe |.

    Esempio:
    moda|http://www.miosito.com/miapagina.htm|_parent
    vestito|http://www.armani.it|_blank

    **Il Codice
    **Innanzi tutto decidiamo che:

    • Comandi.txt è il file contenente i vari comandi
    • $Testo è la variabile php che contiene il testo del documento da elaborare

    Quindi, questo è il codice php:

    [php]function AutoLinks($Stringa) {

            //Leggo tutti i comandi che ci sono nel file Comandi.txt
            $File=fopen("Comandi.txt","r");
                while (!feof($File)) {
                    
                        //In $tmp metto la riga che contiene il comando
                        $tmp=stripslashes(rtrim(fgets($File,4000)));
                        
                        //Scompongo il comando nei suoi elementi
                        $Codici=explode("|",$tmp);
                        
                            $Parola=$Codici[0];
                            $Pagina=$Codici[1];
                            $Target=$Codici[2];
                        
                            //Adesso che ho le mie informazioni separate le invio a una funzione che sostituisce tutte le parole uguali a $Parola con dei link
    $Stringa=Codice_CercaCreaLink($Stringa,$Target,$Pagina,$Parola);
    
                }
            fclose($File);
        
        return $Stringa;
    }
    
    
    function Codice_CercaCreaLink($Stringa,$Target,$Pagina,$Parola) {
    
        $Pos=true;
        $Da=0;
        $Stringa_tmp=strtolower($Stringa); //Crea una copia tutta in minuscolo, perché il comando strpos è sensibile alle Maiuscole e Minuscole. Si potrebbe usare stripos, ma funziona solo con PHP 5. In questo modo, utilizzo $Stringa_tmp per cercare le parole, mentre l'inserimento del codice html lo faccio su $Stringa.
        
        while ($Pos!==false) { //Inizio a scorrere tutto il testo finché non arrivo alla fine
        
            //Cerca la parola
            $Pos=strpos($Stringa_tmp,  $Parola, $Da); //Cerca la prima parola nella copia di Stringa in minuscolo, partendo da $Da
            
            if ($Pos!==false) { //Ho trovato la parola
            
                //Memorizzo la posizione del carattere dove si trova la parola e la sua lunghezza.
                $PrimoCar=$Pos;
                $UltimoCar=strlen($Parola);
                
                //1) Memorizzo la parola originale, ovvero la parola così com'è nel testo.
                $ParolaOriginale=substr($Stringa, $PrimoCar, $UltimoCar);
                //2) Creo il codice html del link
                $URL="<a href=\"$Pagina\" target=\"$Target\">$ParolaOriginale</a>";
                //3) Nel testo originale sostituisco la parola trovata con il codice html appena generato
                $Stringa=substr_replace($Stringa, $URL, $PrimoCar, $UltimoCar);
                
                
                //Ho quindi sostituito la parola con il codice html che la trasforma in link. Adesso, devo proseguire con la ricerca, ma prima devo "aggiornare" il sisitema di ricerca.
               //1) Sposto la ricerca più avanti e lo faccio impostando la posizione da cui iniziare alla posizione rilevata prima + la lunghezza del codice html generato + 1.
                $Da=$Pos + strlen($URL) + 1;
               //2) Aggiorno $Stringa_tmp con una copia del testo appena modificato tutto convertito in minuscolo.
                $Stringa_tmp=strtolower($Stringa);
            
            }
            
            
        
        }
        
        return $Stringa; 
    }
    
    
        //Supponiamo che il testo da trasformare sia in $Testo.
        $Testo=AutoLinks($Testo);
    

    [/php]

    Spero sia giusto. Quello usate da me in Wik-IT è diverso da questo, ovviamente.

    Ciao
    STEVEN


  • Super User

    Bhè, rinnovo i miei complimenti per il nuovo script e per la nuova versione del tuo progetto.

    Lo script l'ho provato e con qualche aggiustamento funziona! :yuppi:

    Avrei però un altro 3 di domandine da farti se non ti dispiace... :mmm:

    Se io voglio che a ogni occorrenza della parola vino mi sostituisca una certa url posso evitare che questa parola venga sostituita anche in una parola che non c'entra nulla com per esempio divino? Una soluzine potrebbe essere quella di mettere gli spazi alla parola vino nel file Comandi.txt?

    Se per es. ho impostato la parola Emilia e la parola Emilia Romagna con questo metodo, posso evitare che la parola Emilia Romagna venga linkata alla parola Emilia?
    Una soluzione potrebbe essere quella di definirmi nel file Comandi.txt prima Emilia Romagna e poi Emilia?

    Posso decidere di sostituire una sola occorrenza di una parola in una pagina anzichè sostituirle tutte?

    Grazie.


  • User

    Se io voglio che a ogni occorrenza della parola vino mi sostituisca una certa url posso evitare che questa parola venga sostituita anche in una parola che non c'entra nulla com per esempio di**vino?**Effettivamente mi sono accorto ora di questa sorta di bug. Una soluzione potrebbe essere di eseguire un controllo quando viene trovata la parola, ovvero si controlla se:

    • prima della parola c'è un carattere "valido" (spazio ');
    • dopo la parola c'è un carattere "valido" (spazio . , ; : ! ? ' ")

    Per carattere "valido" si intende un carattere che può esserci prima o dopo una parola completa.

    Quindi, dopo: if ($Pos!==false)

    Mettiamo (per esempio):

    CaratterePrima=substr($Stringa_tmp, $Pos - 1, 1);
    CarattereDopo=substr($Stringa_tmp, $Pos + strlen($Parola) +1, 1);

    Poi, facciamo il controllo:

    if ( (CaratterePrima==" " or CaratterePrima=="'" ecc.) and (CarattereDopo==" " or CarattereDopo=="," ecc.) ) { esegui tutto il codice per la sostituzione... }

    In teoria, in questo modo dovrebbe sostituire solo le parole che sono precedute e che sono seguite da un carattere considerato "valido".

    Se per es. ho impostato la parola Emilia e la parola Emilia Romagna con questo metodo, posso evitare che la parola Emilia Romagna venga linkata alla parola Emilia?Beh, qui si può fare un pò di tutto. Secondo me, la strada più veloce è inventarsi un tag con il quale definisci le parole che NON DEVONO essere convertite in link. Ad esempio, racchiudendo le parola da non convertire tra parentesi quadre. Poi, prima di visualizzare il testo, si eliminano tutti i tag.

    Per esempio:

    Dopo: $Testo=AutoLinks($Testo);

    Mettiamo:

    $Testo=str_replace("[[", "", $Testo);
    $Testo=str_replace("[[", "", $Testo);

    • Quindi, riprendendo il tuo esempio, se io scrivo:

    Io sono dell'emilia e quindi sono emiliano. La mia regione è l'Emilia Romagna.

    • Con lo script visto prima doveri ottenere:

    Io sono dell'emilia e quindi sono emiliano. La mia regione è l'Emilia Romagna.

    • Usando poi il trucco dei tag, scrivendo:

    Io sono dell'emilia e quindi sono emiliano. La mia regione è l'[[Emilia]] Romagna.

    • Dovrei ottenere:

    Io sono dell'emilia e quindi sono emiliano. La mia regione è l'Emilia Romagna.

    Spero di essere stato chiaro. Fai qualche prova.
    STEVEN


  • Super User

    Sei un mito!!!

    Ho aggiunto il tuo ultimo codice e sembra tutto ok, l'unica cosa che non mi torna è che quando controllo il $caratterePrima e il $carattereDopo ho inserito rispettivamente i caratteri ">" e "<" in modo da prendere per esempio le parole di questo tipo
    <b>Parola1</b>
    <br>Parola2

    Ma il carattere "<" sembra non venir riconosciuto... :mmm:

    E anche nel caso abbia del testo e poi vado a capo. Per esempio nel testo

    ... e poi siamo andati al Mare in vacanza.
    Mare significa sole e divertimento

    Se io voglio sostituire l'occorrenza Mare, la prima volta la sostituisce, la seconda no...

    Il ritorno a capo viene visto con un carattere particolare così come il "<" ed il ">"?

    Grazie infinite!!!!!!!!!


  • User

    Eccomi 🙂

    Mmmm... giustamente se ci sono i codici html tra le balle possono dar noia.

    Comunque, se non riesci a prendere il controllo di un carattere o del ritorno a capo, puoi provare a controllare il codice ASCII del carattere.

    Per esempio, oltre alle istruzioni:

    $CaratterePrima=substr($Stringa_tmp, $Pos - 1, 1);
    $CarattereDopo=substr($Stringa_tmp, $Pos + strlen($Parola) +1, 1);

    Aggiungiamo dopo anche:

    $CaratterePrimaASCII=ord($CaratterePrima);
    $CarattereDopoASCII=ord($CarattereDopo);

    In questo modo, se per esempio hai un ritorno a capo, $CarattereDopoASCII sarà uguale a 13 (cioè il codice Ascii del ritorno a capo).

    Prova così 😉