Mi sono trovato in un problema analogo: avevo URL tutti di uno stesso sito e dovevo ragruppare li uguali. Ho risolto con un sistema a mappe: prendo gli URL, separe le Query, ordino le query, riallaccio Query e URL, riverifico congruenza, prendo gli URL, li confronto uno ad uno, verifico la similitudine percentuale, li collego ad una mappa per similitudine.
A questo punto è l'utente finale che deve impostare la vera somiglianza.
Per il tuo problema devi fare una cosa un po diversa:
[list=1][*]Caricare ogni pagina in una variabile PHP file_get_contents() [*]Rimuovere tutti i tag strip_tags() [*]Confrontare tutte le variabili embro a membro e una ad una per trovare la somiglianza percentuale con quelle già nel DB similar-text() [/list=1]
Per il confronto con silar-text, la parte più difficile, ti propongo la mia soluzione (lascia perdere il contesto che è completamente diverso)
Codice PHP:
function like($url) {
global $settings;
$url = model_url($url); # model_url() ordina i parametri dell'url dopo il ? ed elimina cose come 'http' e 'www'
$url2 = model_url($url, false); # model_url() non ordina dopo il ?
$sql = query("SELECT id FROM " . PREFIX . "map WHERE address = '" . $url . "' LIMIT 1");
if(rows($sql) == 1) { $sql = assoc($sql); return $sql['id']; } //No problems, subito trovato...
$url_array = explode('?', $url); //Separo stringa e URL
//Eseguo prima interrogazione: cerco pagine mappa che cotengono interrogazioni
$sql = query("SELECT id, address FROM " . PREFIX . "map WHERE address LIKE '" . $url_array[0] . "%'");
if(rows($sql) != 0)
{
/* Questa parte � abbastanza astrusa: lo scopo � trovare la maggiore corrispondenza possibile fra due URL per
maggior numero di parametri; ovvero, ad esempio, localhost/page.php?a=1&b=2 � simile a localhost/page.php?a=1.
1. Faccio un ciclo con tutti i possiili valori che assomigliano
2. Separo Query e URL (imposto sempre come chiave array l'id per $sql)
3. Il valore ottenuto entra in un ciclo dove separo tutti i parametri della query
4. Se un valore non viene trovato, passo al valore di $sql successivo
5. Se sono stati trovati e mi trovo all'ultimo valore possibile; imposto questa variabile come possibile. */
if($settings['queryaspage'] == 1)
{
while($fetch = assoc($sql)) {
$mii[$fetch['id']] = explode('?', $fetch['address']);
if(!empty($mii[$fetch['id']][1]))
{
$mii[$fetch['id']] = $mii[$fetch['id']][1];
$values[$fetch['id']] = explode('&', $mii[$fetch['id']]);
foreach((array)$values[$fetch['id']] as $key => $value) {
if(! strstr($url_array[1], $value)) break;
elseif(count($values[$fetch['id']])-1 == $key) {
$videor[$fetch['id']] = $fetch['address'];
}
}
}
}
/*
PARTE CHE TI INTERESSA: CONFRONTO FRA STRINGHE MEMBRO A MEMBRO
/*
/* $videor contiene tutti i possibili valori reputati veri. Li analizzo con un contronto percentuale
fra stringhe. La più simile corrisponde all'URL esatto. */
if(is_array($videor))
{
$url_len = strlen($url);
foreach((array)$videor as $key => $value) {
$value_len = strlen($value);
$is_it[$key] = similar_text($value, $url);
if($value_len >= $url_len)
$is_it[$key] = (100*$is_it[$key])/$value_len;
else $is_it[$key] = (100*$is_it[$key])/$url_len;
}
$real_address = max($is_it);
return $real_id = array_search($real_address, $is_it);
}
} else
{
while($fetch = assoc($sql)) {
$mii[$fetch['id']] = explode('?', $fetch['address']);
$mii[$fetch['id']] = $mii[$fetch['id']][0];
if($url2 == $mii[$fetch['id']]) return $fetch['id'];
}
}
}
//Se non esistono pagine simili, contenenti un'interrogazione, cerco almeno la pagina esatta.
$sql = assoc(query("SELECT id FROM " . PREFIX . "map WHERE address = '" . $url . "' LIMIT 1")); #PLUG
if(count($sql) == 1) return $sql['id'];
$sql = assoc(query("SELECT id FROM " . PREFIX . "map WHERE address LIKE '" . $url . "' LIMIT 1")); #PLUG
if(count($sql) == 1) return $sql['id'];
return false;
}