• User

    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.

    
     
    
     
    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 :bho:

    mi sapreste dare una mano?

    grazie

    ciao


  • User

    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


  • User

    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

    😉


  • User

    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


  • User

    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?


  • User

    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


  • User

    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 :bho:


  • User

    @Bruno61 said:

    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...


  • User

    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


  • User

    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...
    :arrabbiato:


  • User

    @stellina25 said:

    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


  • User Attivo

    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...


  • User

    Ecco il 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, $localita2, 1);

    if ($pos !='')//se ho trovato la localita
    {

    echo "$pos $localita<br>";
    }

    else echo " ";

    }
    [/php]

    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?


  • User Attivo

    Dovrebbe bastare che nell'if if ($pos !='') aggiungi un break; che ti interrompe il ciclo.

    In pratica:

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

  • Super User

    @stellina25 said:

    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à.


  • Moderatore

    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


  • User Attivo

    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...


  • Moderatore

    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...


  • User

    @Gorka said:

    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à.

    [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, $localita2, 1);
    if ($pos !='')
    {

        $lunghezza=strlen($localita);
    

    if ($lunghezza > $max)
    {
    $max = $lunghezza;
    $localita_ok=$localita;
    }
    else $localita_ok='';

    }

    else echo " ";

    }

    [/PHP]

    ho provato a fare come mi hai detto ma stampo sempre entrambe le localita dove sbaglio???? :bho: