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

    parser: selezionare parola esatta

    ciao

    ho creato una piccola funzione che mi permette di scansionare un testo, riconoscervi alcune parole chiave, contenute in un database, e rimaneggiarle in modo da renderle dei collegamenti ipertestuali. il tutto funziona bene. Unico problema, se una parola chiave è parte di una parola più grande, questa viene comunque fatta diventare un link.

    Esempio:
    la mia parola chiave è "control".
    se nel testo ho la parola "controllare", che non è evidentemente parola chiave, il parser legge comunque la parola "control" e mi modifica il testo rendendo solo quella parte un collegamento così:
    controllare

    ora, io vorrei che il parser non modifichi una parola a meno che non sia esattamente quella, e non faccia parte di altre parole più lunghe, cioè solo "control" e non "controllare"

    scrivo di seguito la funzione:

    Codice PHP:
    // Funzione modifica testo
    function scan_text($value="",$tab_key)
    {
       
    $keywords safe_query("SELECT * FROM $tab_key");
       if (
    mysql_num_rows($keywords)){
          while(
    $key mysql_fetch_array($keywords)){
            
    $indirizzo $key['indirizzo'];
            
    $key str_ireplace("_"," ",$key['keyword']);
        
            
    // NUCLEO DEL PARSER
            
    $value eregi_replace($key,"<a href=\"index.php?action=".strtolower($indirizzo)."\">".$key."</a>",$value);
          }
       }
       return 
    $value;

    grazie
    Mano

  2. #2
    beh, semplicemente ti basta controllare il carattere subito precedente e subito successivo alla parola che hai trovato e li controlli: se sono spazi, punti, virgole o in generale altri simboli di separazione ok, altrimenti non ti interessa

    il problema è che il sistema che utilizzi attualmente è considerevolmente pesante:
    - sia per via del num rows
    - sia per via dell'eregi

    o fai tutto con una sola espressione regolare (una preg) oppure ti fai un piccolo parser con strpos per acquisire la posizione della parola e per poter quindi controllare cosa c'è prima e dopo e per poterlo anche sostituire

    però la soluzione con la preg è meglio (molto meglio) perché il motore dietro le preg, prima di eseguirle, converte la sequenza in (fisicamente) codice macchina che viene richiamato ed è quindi MOLTOOOOO più performante, soprattutto nel tuo caso che ti puoi trovare TANTISSIMA roba da controllare

    alternativamente la soluzione con strpos è pure molto veloce se la applichi correttamente però sicuramente più pesante delle preg.

    quanti elementi potresti avere dentro quella tabella? 100? 1000? 10000?

  3. #3
    Originariamente inviato da daniele_dll
    beh, semplicemente ti basta controllare il carattere subito precedente e subito successivo alla parola che hai trovato e li controlli: se sono spazi, punti, virgole o in generale altri simboli di separazione ok, altrimenti non ti interessa
    attualmente, considerando solo gli spazi prima e dopo sembro aver risolto il problema, almeno temporaneamente.

    quanti elementi potresti avere dentro quella tabella? 100? 1000? 10000?
    per il momento sono circa 70. comunque non penso che possano salire oltre i 200.

    proverò a studiare una soluzione alternativa con le funzioni più prestanti da te citate.

    grazie per le idee!

  4. #4
    credo di aver risolto in un modo decisamente più efficace utilizzando una preg_replace, dopo aver finalmente capito come usare le regexp. in effetti avevo già provato con le preg ma non riuscivo a farle funzionare con l'espressione "$key" perchè non mettevo la barra / iniziale "/$key".

    il codice utilizzato per ricerca e sostituzione è il seguente.

    Codice PHP:
    $value preg_replace("/$key\\b/i","<a href=\"index.php?action=".strtolower($indirizzo)."\">".ucfirst($key)."</a> ",$value); 
    per ovviare al problema delle parole all'interno di altre parole ("control" anziché "controller") basta mettere il delimitatore "\b" che indica Word Boundry, ovvero tradotto alla bell'e meglio parola singola/intera.

    ciao!

  5. #5
    ok, però, puoi migliorare la cosa ancora

    innanzi tutto è necessario il modificatore g, altrimenti verranno sostituire solo le prime occorrenze delle parole.

    Inoltre, attualmente, se una parola è esattamente all'inizio o esattamente alla fine non viene riconosciuta. Inoltre se una parola finisce con la tua parola chiave, quella parte viene identificata come parola chiave

    Insomma è da migliorare un pò

    Detto questo, per rendere il tutto più efficente puoi raggruppare le parole in array di, ad esempio, 100 elementi

    $keywords[$key] = $url

    e poi la preg_replace la costruisci facendo qualcosa tipo


    $value = preg_replace('/(' . implode('|', array_keys($keywords)) . ')\b/gi', "'<a href=\"index.php?action=' . strtolower('\\1') . '\">' . ucfirst('\\1') . '</a>'", $value

    Se dai un occhio a
    http://it2.php.net/manual/en/referen....modifiers.php

    vedrai il modificatore e ovvero un modificatore che ti permette di eseguire codice php per effettuare la sostituzione

    In questo modo la cosa è decisamente più efficente

    In realtà sarebbe poi da tarare bene il numero di elementi da sostituire in una sola volta

  6. #6
    Originariamente inviato da daniele_dll
    innanzi tutto è necessario il modificatore g, altrimenti verranno sostituire solo le prime occorrenze delle parole.
    in realtà non fa così. cioè prende tutte le occorrenze anche multiple della parola. Cioè se in una stringa di testo ho più volte la parola "control" me la evidenzia tutte le volte.

    Inoltre, attualmente, se una parola è esattamente all'inizio o esattamente alla fine non viene riconosciuta.
    invece funziona. ho provato a generare stringe contententi solo la parola di interesse e viene evidenziata. sinceramente non so come mai. dovrei controllare meglio, magari introduco del testo (html) automaticamente da qualche parte.

    Inoltre se una parola finisce con la tua parola chiave, quella parte viene identificata come parola chiave
    è vero. questo però è facilmente risolvibile mettendo \b prima della $key, cioè:
    Codice PHP:
    preg_replace("/\\b$key\\b/i",... 

    nel frattempo proverò ancora seguendo i tuoi suggerimenti. ti terrò aggiornato! grazie mille del feedback!

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.