Я пишу скребковые ссылки со всего сайта, включая подстраницы, и обнаружил небольшую проблему. Мне пришла в голову идея использовать рекурсивную функцию, потому что страница, которую я хочу сканировать, имеет несколько уровней. Его структура выглядит примерно так:
Level 1 reference
- Second level reference
-- Third level reference
-- Third level reference
- Second level reference
-- Third level reference
-- Third level reference
-- Third level reference
--- Level four reference
Никогда не бывает до конца ясно, есть ли более или менее скрытые под проверенной ссылкой, поэтому я пришел к идее рекурсивной функции.
Он берет ссылку на главную страницу, берет первую, и если количество ссылок на ней больше единицы, это относится к той же функции.
К сожалению, что-то пошло не так, и у меня пустая доска, как это исправить?
function scanWebsite($url) {
$html = file_get_contents($url);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$nodes = $xpath->query("/html/body//a");
$output = [];
foreach($nodes as $node) {
$url = $node->getAttribute("href");
if (count($nodes) > 1) {
scanWebsite("http://samplewebsite.com" .$url);
} else {
if (preg_match("//title/.*//", $url)) {
array_push($output, $url);
}
continue;
}
}
return $output;
}
echo '<pre>';
print_r(scanWebsite("http://samplewebsite.com"));
echo '</pre>';
Вы не используете возвращаемое значение `scanWebsite (" samplewebsite.com ". $ Url); `
Хорошо. Если код внутри цикла foreach выполняется, то count($nodes) > 1 всегда будет истинным. Вызов scanWebsite в блоке if теоретически возвращает массив, но вы его ничему не назначаете. Код в блоке else никогда не будет выполнен. После устранения этих проблем необходимо рассмотреть возможность циклических ссылок. Если у вас есть ссылки на страницы, которые вы уже просканировали, вы получите бесконечную рекурсию.






Я не читал его подробно, но на первый взгляд кажется, что рекурсивный вызов, который ничего не возвращает, может быть проблемой.