+ Rispondi alla Discussione
Risultati da 1 a 19 di 19

reicerca di parole all'intero di un testo

Ultimo Messaggio di stellina25 il:
  1. #1
    User
    Data Registrazione
    May 2007
    Messaggi
    15

    reicerca di parole all'intero di un testo

    Ciao a tutti,
    sto cercando di fare un piccolo script che è in grado di recuperare una località all'interno di un testo.

    Sono in parte riuscita a raggiungere l'obiettivo ma cerco qualche idea per far si che lo script funzioni bene.

    Riassumento:
    Ho un testo che contiene il nome di una localita.

    Ho una tabella in un db con i nomi di tutte le localita e confronto ogni localita con il testo per vedere se è presente.

    Codice:
     
    
     
    function strpos2($haystack, $needle, $nth = 1)
    {
        
        $haystack = ' '.$haystack;
        if (!strpos($haystack, $needle))
            return false;
        $offset=0;
        for($i = 1; $i < $nth; $i++)
            $offset = strpos($haystack, $needle, $offset) + 1;
        return strpos($haystack, $needle, $offset) - 1;
    }
    
    
    $string = 'abcdef abcdef dfgdsf gsdrwer ef gdsf gdsf gdsfgsdfgdsf gdsfdas fdsf df asdf  san benedetto del tronto fdgs dfg dsf gdsf gdfgfdsgdgs f re tretret ';
    
    $newstring=strtolower($string);
    
    
    $sql="SELECT nome FROM localita";
    
    $result=mysql_query ($sql);
     while ($data=mysql_fetch_array($result))
     {
        $nome=$data['nome'];
    $localita = strtolower($nome);
    $pos = strpos2($newstring, $localita, 1);
    	if ($pos !='')//se ho trovato la localita mi faccio restituire la sua posizione ed il suo nome
    	{
    	echo "$pos $localita<br>";
    	}
    	else echo " ";
    	
     
     }
    
    
    Il mio problema al momento è questo :
    estrapolare il risultato corretto tra quelli ottenuti.

    In questo caso infatti ho ottenuto questi risultati:
    83 ne
    134 re
    96 ro
    77 san benedetto
    77 san benedetto
    77 san benedetto del tronto
    137 tret

    ma la riga estatta è san benedetto del tronto....

    non riesco a capire cosa potrei fare per ottenere il risultato corretto

    mi sapreste dare una mano?

    grazie

    ciao

  2. #2
    User
    Data Registrazione
    Jun 2007
    Messaggi
    20
    Ciao

    perche al posto della tua funzione str2 non cerchi la località direttamente nella query mettendo la clausola where nome like "%testo su cui cercare%"?

    il carattere % in mysql significa qualsiasi carattere quindi la query
    select nome from localita where nome like "%testo su cui cercare%"
    ti restituisce le località contenute nel testo

  3. #3
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    non so se ho capito bene ma ho provato ad impostare una query del tipo:

    SELECT nome FROM localita WHERE nome LIKE '%g dfg fdg dsf gdsf gdfgfds g san benedetto del tronto fdsf gdsf gdsf gdsf gdsf gfds g%'


    ma non funziona....
    può essere che abbia capito male quello che volevi dire ...

    grazie



  4. #4
    User
    Data Registrazione
    Jul 2007
    Messaggi
    73
    Ciao,
    immagino che tu abbia un po' di "fuffa" nella tabella localita altrimenti non si spiegherebbero le linee con "re","ro","ne" e cosi' via, visto che sono stampate cosi' come ritornate dalla query.

    Ciao
    Bruno

  5. #5
    User
    Data Registrazione
    Jun 2007
    Messaggi
    20
    ma la query
    SELECT nome FROM localita WHERE nome LIKE "%g dfg fdg dsf gdsf gdfgfds g san benedetto del tronto fdsf gdsf gdsf gdsf gdsf gfds g%"

    nn ti restituisce nessun record?
    ti dovrebbe restituire san benedetto del tronto, ti da errore mysql?
    l'hai provata su phpmadmin?

  6. #6
    User
    Data Registrazione
    Jun 2007
    Messaggi
    20
    scusa ho sbagliato query io...
    prova cosi
    SELECT nome FROM localita WHERE 'g dfg fdg dsf gdsf gdfgfds g san benedetto del tronto fdsf gdsf gdsf gdsf gdsf gfds g' REGEXP nome

  7. #7
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    select eseguita:
    SELECT nome
    FROM localita
    WHERE 'g dfg fdg dsf gdsf gdfgfds g san benedetto del tronto fdsf gdsf gdsf gdsf gdsf gfds g' REGEXP nome


    Risultato ottenuto dalla query:
    Ne
    Ro
    San Benedetto
    San Benedetto
    San Benedetto del Tronto

    ... non va ancora bene

  8. #8
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    Citazione Originariamente Scritto da Bruno61 Visualizza Messaggio
    Ciao,
    immagino che tu abbia un po' di "fuffa" nella tabella localita altrimenti non si spiegherebbero le linee con "re","ro","ne" e cosi' via, visto che sono stampate cosi' come ritornate dalla query.

    Ciao
    Bruno

    le localita provengono da fonte certa, la località Ne per esempio sta in provincia di Genova
    http://www.paesionline.it/liguria/ne/comune_ne.asp

    le altre località le ho verificate e sono presenti in altre zone d'italia...

  9. #9
    User
    Data Registrazione
    Jul 2007
    Messaggi
    73
    e localita provengono da fonte certa, la località Ne per esempio sta in provincia di Genova
    Cavoli, chiedo umilmente scusa agli abitanti di Ne, Re, Ro, Tret per aver definito i loro paesi come fuffa.

    Tornando al problema, puo' essere parzialmente risolto imponendo uno spazio all'inizio e alla fine del nome della localita' cercata, qualcosa tipo

    $haystack = ' '.$haystack . ' ';
    strpos($haystack, ' ' . $needle . ' ', $offset);

    Cosi' pero' vengono comunque trovati anche tutti i San Benedetto con o senza Tronto, il che richiede un po' piu' di elaborazione.

    Ciao
    Bruno


  10. #10
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    penso che il mio problema sia proprio elaborare la soluzione giusta in grado di estrapolarmi il risultato desiderato...
    per di più non è detto che la località sia composta da più parole potrebbe essere costituta da una paola sola e non so se inserendo gli spazi troverei dei vantaggi...

  11. #11
    User
    Data Registrazione
    Jul 2007
    Messaggi
    73
    Citazione Originariamente Scritto da stellina25 Visualizza Messaggio
    penso che il mio problema sia proprio elaborare la soluzione giusta in grado di estrapolarmi il risultato desiderato...
    per di più non è detto che la località sia composta da più parole potrebbe essere costituta da una paola sola e non so se inserendo gli spazi troverei dei vantaggi...
    Be', con gli spazi aggiuntivi almeno togli di mezzo le localita' che coincidono parzialmente con una parola nel testo (Ro,Re,...) e le localita' formate da una singola parola vengono trovate senza ambiguita'.

    Poi, pensandoci, conviene che filtri anche la punteggiatura, se presente, e altri caratteri non alfanumerici.

    Ciao
    Bruno

  12. #12
    User
    Data Registrazione
    Mar 2006
    Messaggi
    130
    Premesso che, la certezza matematica che la parola che cerchi sia una località non la puoi avere... ad esempio la parola Bari o Trapani sono si località ma potrebbero essere anche semplici parole...

    1) il testo in cui cerchi trasformalo in " ".$testo." " (Ossia aggiungi uno spazio in testa e in coda
    2) Quando confronti, fai lo stesso con la località, ossia mettici uno spazio in testa ed in coda
    3) Ordina le località in modo discendente, cosi' prima cerchi "localita di due parole" e poi "Localita"...

    Cosi' dovresti raggiungere un risultato accettabile... non certo... quello non puoi se non cercando a mano e valutando le singole parole in base al contesto della frase...

  13. #13
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    Ecco il codice:

    Codice PHP:
     
    $string 
    'abcdef abcdef dfgdsf gsdrwer ef gdsf gdsf gdsfgsdfgdsf gdsfdas fdsf df asdf  luogo di lavoro: san benedetto del tronto fdgs dfg dsf gdsf gdfgfdsgdgs f re tretret';
    $string2 " ".$string." " ;
     
    $newstring=strtolower($string2);
    $sql="SELECT nome FROM localita ORDER BY nome DESC";
    $result=mysql_query ($sql);
     
     while (
    $data=mysql_fetch_array($result))
     {
        
    $nome=$data['nome'];
     
    $localita strtolower($nome);
     
     
    $localita2 " ".$localita." " 
     
     
    $pos strpos2($newstring$localita21);
     
     if (
    $pos !='')//se ho trovato la localita
     
    {
     
      echo 
    "$pos $localita<br>";
     }
     
     else echo 
    " ";
     
     } 

    in questo modo stampo tutte le soluzioni :
    94 san benedetto del tronto
    94 san benedetto
    94 san benedetto
    151 re



    ma se voglio stampare solo la prima come devo fare?

    Se invece voglio prendere la parola più lunga strlen($localita) tra quelle stampate indipendentemente dall'ordine con cui vengono stampate come potrei fare il controllo?
    Ultima modifica di stellina25; 17-07-07 alle 09:01

  14. #14
    User
    Data Registrazione
    Mar 2006
    Messaggi
    130
    Dovrebbe bastare che nell'if if ($pos !='') aggiungi un break; che ti interrompe il ciclo.

    In pratica:
    Codice:
     if ($pos !='')//se ho trovato la localita
    {
      echo "$pos $localita<br>";
      break;
    }

  15. #15
    Esperto L'avatar di Gorka
    Data Registrazione
    Apr 2006
    Località
    Ragusa
    Messaggi
    1,681
    Citazione Originariamente Scritto da stellina25 Visualizza Messaggio

    Se invece voglio prendere la parola più lunga strlen($localita) tra quelle stampate indipendentemente dall'ordine con cui vengono stampate come potrei fare il controllo?
    Fuori dal ciclo inizializzi una varibile $max=0
    Dentro il ciclo dovresti controllare ogni volta se strlen($localita) > $max allora $max = strlen($localita) e ti estrai la key di quella località.

  16. #16
    Moderatore L'avatar di Criss
    Data Registrazione
    May 2006
    Località
    Rimini
    Messaggi
    454
    scusate eh? non so se ho capito bene il fine di tutto questo m ase devi trovare "san benedetto del tronto" in un campo di un DB che è ad esempio "mangiare e dormire a san benedetto del tronto, che bella città ecc ecc" basta fare
    SELECT campo FROM tabella WHERE campo LIKE 'san benedetto del tronto'
    in alternativa, se ho capito male il problema, dovresti riuscirci con
    SELECT campo FROM tabella WHERE campo LIKE '%san benedetto del tronto%'

    ciao

  17. #17
    User
    Data Registrazione
    Mar 2006
    Messaggi
    130
    Se vogliamo essere precisi la prima select che hai scritto ti trova solo i record che hanno campo UGUALE al testo, non SIMILE, anche se usi la LIKE... e' corretta la seconda invece...

    Peccato che per sua natura quella select ti restituisce anche i record relativi a san benedetto del tronto, quando cerchi solo san benedetto.... piu' tutta un'altra serie di casistiche e di risultati indesiderati...

  18. #18
    Moderatore L'avatar di Criss
    Data Registrazione
    May 2006
    Località
    Rimini
    Messaggi
    454
    ben appunto..se vogliamo essere precisi...
    qual'è la problematica precisa? Avevo ben spiegato mi sembra ch enon mi era chiarissima la problematica e qundi ho dato le du esoluzioni ch edovrebbero portare a risolvere poi il problema con altri step successivi...

  19. #19
    User
    Data Registrazione
    May 2007
    Messaggi
    15
    Citazione Originariamente Scritto da Gorka Visualizza Messaggio
    Fuori dal ciclo inizializzi una varibile $max=0
    Dentro il ciclo dovresti controllare ogni volta se strlen($localita) > $max allora $max = strlen($localita) e ti estrai la key di quella località.

    Codice PHP:
      $max=0;
      
    $localita_ok='';  
     while (
    $data=mysql_fetch_array($result))
     {
        
    $nome=$data['nome'];
        
    $id=$data['id'];
     
    $localita strtolower($nome);
        
     
    $localita2 " ".$localita." " 
      
     
    $pos strpos2($newstring$localita21);
     if (
    $pos !='')
     {
       
            
    $lunghezza=strlen($localita);
      
      if (
    $lunghezza $max)
      {
         
    $max $lunghezza;
         
    $localita_ok=$localita;
       } 
       else 
    $localita_ok=''
      
     }
     
     else echo 
    " ";
     
     } 
    ho provato a fare come mi hai detto ma stampo sempre entrambe le localita dove sbaglio????

+ Rispondi alla Discussione

^ Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice [VIDEO] è Attivato
  • Il codice HTML è Disattivato
  • Trackbacks Attivato
  • Pingback Attivato
  • Refback Attivato

SEO by vBSEO 3.6.0 PL2 ©2011, Crawlability, Inc.