как взять только нужное?

scandal

Новичок
как взять только нужное?

Здраствуйте!
Вот собрал функцию, которая из указанной страницы выдергивает имеющиеся в ней линки:
function SplitLinks(&$content,&$m)
{
$arr=array();
$pattern="/href=[\'|\"](.*?)[\'|\"]/";
$k=preg_match_all($pattern, $content, $arr);
for($j=0;$j<$k;$j++) $m[$j]=$arr[1][$j];
$m=array_unique($m);
$k=count($m);
return $k;
}

У меня несколько вопросов.
1. Тут перед выходом из функции нужно делать unset($arr);?
2. Можно ли как-то оптимизировать этот кусок?
3. Самое важное! В $m получается массив ссылок. Можно как-то определить, не скачав файл, что в нем текст?

Заранее спасибо!
 

scandal

Новичок
Поисковик свой узкотематический хочу сделать.
Не беспокойтесь, индексировать будем только сайты, хозяева которых сами этого хотят.
Нужно скрипт научить скачивать только ссылки на другие страницы.
Поэтому, наверное, для начала нужно научиться распознавать файлы, в которых текст, а не картинка, например.
 

zerkms

TDD infected
Команда форума
1. Тут перед выходом из функции нужно делать unset($arr);?
нет

2. Можно ли как-то оптимизировать этот кусок?
$pattern="/href=[\'|\"](.*?)[\'|\"]/";
$k=preg_match_all($pattern, $content, $arr);
return count(array_unique($arr[1]));

-~{}~ 24.07.08 18:18:

function SplitLinks(&$content,&$m)

тут точно нужно передавать аргументы ссылками?
 

scandal

Новичок
Контент передал ссылкой, потому что думал, так лучше, чем весь текст передавать. Разве не так?
А &m для того чтобы сами линки дальше можно было обрабатывать.
zerkms?
 

zerkms

TDD infected
Команда форума
Контент передал ссылкой, потому что думал, так лучше, чем весь текст передавать. Разве не так?
нет (пхп, надеюсь, 5 ?)

А &m для того чтобы сами линки дальше можно было обрабатывать.
функция возвращает данные через return
 

scandal

Новичок
Сделал такой вариант:
function SplitLinks1($content,&$m)
{
$pattern="/href=[\'|\"](.*?)[\'|\"]/";
preg_match_all($pattern, $content, $arr);
$k=count(array_unique($arr[1]));
$m=$arr[1];
return $k;
}
Вроде работает, но нету ли тут ошибок каких?
Задача. Вычислить линки и удалить дубликаты.
 

scandal

Новичок
и как быть?

-~{}~ 24.07.08 12:11:

я про href, HREF, Href, hReF. можно это как-то предусмотреть в рег.выре?
 

zerkms

TDD infected
Команда форума
scandal
поставить модификатор i
а ещё - убрать | из [\'|\"]
 

scandal

Новичок
Сделал.
Спасибо!
А мне начинает нравиться на этом форуме :)
Вот итоговая:
function SplitLinks1($content,&$m)
{
$pattern="/href=[\'\"](.*?)[\'\"]/i";
preg_match_all($pattern, $content, $arr);
$k=count(array_unique($arr[1]));
$m=$arr[1];
return $k;
}
 

Baranov_Dron

Новичок
Автор оригинала: scandal
Поисковик свой узкотематический хочу сделать.
Не беспокойтесь, индексировать будем только сайты, хозяева которых сами этого хотят.
Нужно скрипт научить скачивать только ссылки на другие страницы.
Поэтому, наверное, для начала нужно научиться распознавать файлы, в которых текст, а не картинка, например.
Не брался я бы за эту задачу.... Слишком много всего надо решить.
1) ссылки типа 1.html, ../1.html и тд нужно перевести в абсолютные
2) во вторых надо учесть, что сайт с www и без - это один сайт
3) учесть html тег base('~<base\s+href\s*=\s*[\'"]?([^\'">]+).*?>~is')
4) Cделать список забаненных расширений в ссылке(рисунки, архивы и тд)
5) Учесть работу с кодировками(смотри недавнюю тему про кодировки тут)
6) Надо отбирать только ссылки http протокола(ну ещё если хочешь https)
7) Для страницы нужно установить лимит загрузки, в курле
curl_setopt($curl, CURLOPT_WRITEFUNCTION, array (&$this, "writeFunction"));
private function writeFunction($curl, $str)
{
$this->content .= $str;
if (strlen($this->content) > $this->maxsize)
return 0;
else
return strlen($str);
}
8) вот моя регулярка, выдирающая ссылки "#<a(?=\s)(?:(?!href).)+href\s*=\s*['\"]?(.*?[^\s'\"<>]*)#i"
и куча ещё всяких ньюансов....
 

zerkms

TDD infected
Команда форума
2) во вторых надо учесть, что сайт с www и без - это один сайт
поправка: большинству пользователей привито с рождения, что это один и тот же сайт.
 

scandal

Новичок
почему-то выше приведенная функция дубликаты не удаляла. теперь она выглядит так:

function SplitLinks($content,&$m)
{
$pattern="/href\s*=\s*['\"](.*?)['\"]/i";
preg_match_all($pattern, $content, $arr);
$m=array_unique($arr[1]);
}

а бросить затею можно всегда :)
 
Сверху