Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz

17.04.2009, 11:53
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
Тогда лучше пример такого файла ТОЧНЫЙ (или сказать, что точно так, как в вопросе, только хост заменен) + идут ли такие вот записи подряд или нет (одна под другой, или может быть случайное расположение)
PHP код:
<pre>
<?php
$str1 = "site.com/?id=1&page=end";
$str2 = "site.com/?id=2&page=end";
$var1 = similar_text($str1, $str2, &$tmp);
echo "Совпадение в процентах: $tmp\n"; // примерно 95%,
//значит практически идентичны, для нас по условиям., идентичны
//Если отличие больше - значит у нас новая ссылка:
$str1 = "site.com/?id=1&page=end";
$str2 = "site.com/?pp=1&page=main&sort=1";
$var1 = similar_text($str1, $str2, &$tmp);
echo "Совпадение в процентах: $tmp\n"; // примерно 70%
//разница большая, новая уникальная ссылка (по условиям)
?>
</pre>
но в данном случае лучше всего подойдет функция Левенштейна, которая просто показывает, сколько символов надо заменить, чтобы из первой строки получить вторую, т.е. если возвращает 1 - строки АБСОЛЮТНО ИДЕНТИЧНЫ по условию задачи:
PHP код:
<?php
$str1 = "site.com/?id=1&page=end";
$str2 = "site.com/?id=2&page=end";
$var = levenshtein($str1,$str2);
echo($var); // вернет 1
?>
</pre>
если строки идут не подряд такого рода, а в разброс - то файл в массив и предварительная сортировка, потом обычное построчное чтение с помощью fgets() и сравнению по Левенштейну
т.е. по задаче конкретно примерно так выглядеть будет по идее:
PHP код:
<pre>
<pre>
<?php
$file = 'tema1.txt'; // Файл с ссылками
$res = 'tema10.txt'; // Результирующий файл
// функция для сравнения по Левенштейну
function lev($str1,$str2) {
$a = levenshtein($str1,$str2);
if ($a!=1) return true;
return false;
}
// Соритруем файл с сылками
$sort = file($file);
sort($sort);
file_put_contents($file,$sort);
// Начинаем отбирать "уникальные" ссылки
$hand1 = fopen($res,'w');
$hand = fopen($file,'r');
while(!feof($hand)) {
$buf1 = trim(fgets($hand));
$buf2 = trim(fgets($hand));
if (lev($buf1,$buf2)) fwrite($hand1,$buf1. "\n" .$buf2 ."\r\n");
else fwrite($hand1,$buf1 . "\r\n");
}
fclose($hand);
fclose($hand1);
echo 'Done';
?>
</pre>
Погонял щаз, на самом деле и этот вариант неправильный, т.к. будет работать только для ДВУХ подряд идущих ссылок  )) А если их таких три и больше - не сработает. Поэтому вот ПРАВИЛЬНЫЙ вариант на любое кол-во таких ссылок:
PHP код:
<pre>
<?php
$file = 'tema1.txt'; // Файл с ссылками
$res = 'tema10.txt'; // Результирующий файл
// функция для сравнения по Левенштейну
function lev($str1,$str2) {
$a = levenshtein($str1,$str2);
if ($a==1 or $a==0) return false;
return true;
}
// А теперь сравниваем каждую строку
//со всеми при помощи функции выше
function Ustr ($hand, $str)
{
fseek($hand,0);
while (!feof ($hand)) {
$temp = trim(fgets($hand));
if (!lev($str,$temp))
return false;
}
return true;
}
// Сортируем файл с сылками
$sort = file($file);
sort($sort);
file_put_contents($file,$sort);
// Начинаем отбирать "уникальные" ссылки
$hand1 = fopen($res,'w+');
$hand = fopen($file,'r');
while(!feof($hand)) {
$buf = trim(fgets($hand));
if (Ustr($hand1,$buf)) {
fseek ($hand1, 0, SEEK_END);
fwrite($hand1,$buf ."\r\n");
}
}
fclose($hand);
fclose($hand1);
echo 'Done';
?>
</pre>
Последний раз редактировалось Pashkela; 17.04.2009 в 13:28..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|