- Home
- Categorie
- Coding e Sistemistica
- PHP
- reicerca di parole all'intero di un testo
-
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 tretma 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
-
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
-
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
-
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
-
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?
-
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
-
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 nomeRisultato ottenuto dalla query:
Ne
Ro
San Benedetto
San Benedetto
San Benedetto del Tronto... non va ancora bene :bho:
-
@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
Brunole localita provengono da fonte certa, la località Ne per esempio sta in provincia di Genova
http://www.paesionline.it/liguria/ne/comune_ne.asple altre località le ho verificate e sono presenti in altre zone d'italia...
-
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
-
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...
-
@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
-
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...
- il testo in cui cerchi trasformalo in " ".$testo." " (Ossia aggiungi uno spazio in testa e in coda
- Quando confronti, fai lo stesso con la località, ossia mettici uno spazio in testa ed in coda
- 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...
-
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 rema 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?
-
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; }
-
@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à.
-
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
-
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...
-
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...
-
@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: