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

    Funzione dizionario corrompe links

    Ciao a tutti, ho creato questa funzione che rende indirizzi email e link cliccabili, poi analizza il testo alla ricerca di parole errate (le parole "giuste" sono contenute in un db), che vengono sottolineate di rosso. Il problema e' che anche le parole all'interno dei link vengono sottolineate, rendendo di fatto il link inutilizzabile. Per capirci se in input inserisco 'foo@bar.it' mi restituisce '<u>foo</u>@bar.<u>it</u>'. Come posso fare per far riconoscere alla funzione i link in modo che non vengono considerati come parole errate? Grazie

    Codice PHP:
    $regexemail '/([a-z0-9_%+-][a-z0-9._%+-]*@([a-z0-9.-]+\.)+[a-z]{2,6}){1}/i';
    $replace '<a href="mailto:$0">$0</a>';
    $emailtext preg_replace($regexemail,$replace,$text);

    $regexftphtml '/(ftps?|https?:\/\/)([\da-z-]+\.)+[a-z]{2,6}[\/\w .-]*\/?/i';
    $replace "<a href=\"$0\" target=\"_blank\">$0</a>";
    $text preg_replace($regexftphtml,$replace,$emailtext);

    $conn mysqli_connect('127.0.0.1','root','','esame') or die("Connection failed: ".mysqli_error($conn));

    $vocabolario = array();
    $text nl2br($text); //aggiungo <br> al posto di \r\n
    $text2 str_replace('\'',' ',strip_tags($text)); //elimino tags html e sostituisco gli apostrofi con uno spazio
    $words array_unique(str_word_count($text21'1234567890')); //divido il testo in singole parole, elimino i doppioni e le metto nell'array
    $list implode("','",$words); //creo lista delle parole da usare nella query

        
    $query mysqli_query($conn,"SELECT vocabolo FROM vocabolario WHERE vocabolo IN ('$list')");
        while (
    $voc mysqli_fetch_array($query,MYSQLI_ASSOC))
        {
        
    $vocabolario[] = $voc['vocabolo'];
        }
        
    mysqli_close($conn);
        
        foreach (
    $words as $parola)
        {
            if (!
    in_array(strtolower($parola),$vocabolario))
            {
            
    $replacement"<u>$parola</u>";
            
    $text preg_replace("/\b$parola\b/i"$replacement$text);
            }
        }

    return 
    str_replace('\' ','\'',$text); 

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Prova questo. L'idea è di sostituire i tag A con un valore calcolato per poi ripristinarli.

    Codice PHP:
    <?php
    //----- Il testo
    $text   "Ciao a tutti, ho creato questa funzione che rende indirizzi email e link cliccabili, 
    poi analizza il testo alla ricerca di parole errate (le parole 'giuste' 
    sono contenute in un db), che vengono <a href='http://www.mio_sito.it'>sottolineate di rosso</a>. Il problema e' che anche le parole 
    all'interno dei link vengono sottolineate, rendendo di fatto il link <a href='http://www.my_site.co.uk'>inutilizzabile</a>. Per capirci se in input
     inserisco 'foo@bar.it' mi restituisce '<u>foo</u>@bar.<u>it</u>'. Come posso fare per far riconoscere alla 
     funzione i <a href='http://www.mon_site.fr'>link</a> in modo che non vengono considerati come parole errate? Grazie"
    ;


    //=============================================
    // Si rimpiazzano i tag A con un valore unico
    // poco probabile
    //=============================================
    //----- Il pattern
    $pattern "/(<\s*a\s*([^>]*)\s*>(.*?)<\/\s*a\s*>)/si";
    //----- cerco tutti i tag A e li metto in $occurrences
    preg_match_all($pattern,$text,$array);
    $occurrences $array[1];
    //----- rimpiazzo i tag A 
    $listTagA    = array();
    $listRepStr  = array();
    foreach(
    $occurrences as $key => $value) {
     
    //----- Rimpiazzo ogni tag A con un valore poco probabile
     //      che comunque è una parola
     
    $replace      "azertyuiop${key}poiuytreza";
     
    $listRepStr[] = $replace;
     
    $listTagA[]   = $value;
     
    $text         str_replace($value,$replace,$text);
    // foreach($occurrences as $key => $value)
    //=============================================


    //=============================================
    // Questa è la tua parte
    //=============================================
    $text        nl2br($text); //aggiungo <br> al posto di \r\n
    $text2       str_replace('\'',' ',strip_tags($text)); //elimino tags html e sostituisco gli apostrofi con uno spazio
    $words       array_unique(str_word_count($text21'1234567890')); //divido il testo in singole parole, elimino i doppioni e le metto nell'array
    $list        implode("','",$words); //creo lista delle parole da usare nella query
      
    $vocabolario = array('pippo','pluto');
        
        foreach (
    $words as $parola)
        {
        
    //=====> Se la parola NON corrisponde a un tag A <=======
        
    if (!in_array(strtolower($parola),$listRepStr)) {
            if (!
    in_array(strtolower($parola),$vocabolario))
            {
            
    $replacement"<u>$parola</u>";
            
    $text preg_replace("/\b$parola\b/i"$replacement$text);
            }
       }
        }
    //=============================================


    //=============================================
    // Si ripristinano i tag A 
    //=============================================
    //----- Ripristino i tag A
    $text str_replace($listRepStr,$listTagA,$text);  
    print 
    $text;
    //=============================================
      
     
    ?>
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Come procederei io:

    codice:
    function wordCheck($word) {
        $word = $word[0];
        
        if (...) {// qui controllo se $word è una parola valida
            return $word;
        }
        
        return '<u>'.$word.'</u>';
    }
    
    function textCheck($text) {
        return preg_replace_callback('#(?!<.*?)\w+(?![^<>]*?>)#','wordCheck',$text);
    }
    
    echo textCheck("La mia è una provaa con del testo: <a href='http://pippo.it'>html</a>.");
    Demo: http://3v4l.org/vgZOC
    Ultima modifica di .Kurt; 08-12-2014 a 22:21

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Bello.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    Provando a risolvere il problema delle parole con maiuscole:

    codice:
    $vocabolario = array("la", "mia", "una", "prova", "con", "del", "testo");
    
    function textCheck($text, &$vocabolario) {
        return preg_replace_callback('#(?!<.*?)\w+(?![^<>]*?>)#', function ($word) use ($vocabolario) {
            $word = $word[0];
            
            if (preg_grep( "/".preg_quote($word)."/i" , $vocabolario)) {
                return $word;
            }
            
            return '<u>'.$word.'</u>';
        }, $text);
    }
    
    echo textCheck("La mia è UNA provaa con del testo: <a href='http://pippo.it'>html</a>.", $vocabolario);
    Demo: http://3v4l.org/OUF9U
    Ultima modifica di .Kurt; 08-12-2014 a 23:31

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.