Этот код анализирует содержимое двух веб-сайтов, беря из них все атрибуты href
. Затем он находит те, которые имеют наибольшее совпадение значения href из каждого массива, и сохраняет их в файл CSV. Проблема в том, что когда я открываю файл, он возвращает также HTML-данные моего приложения.
В качестве упражнения я могу использовать только HTML и PHP.
<html>
<body>
<form action = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method = "post">
website:
<input type = "text" name = "website1">
<br>
website:
<input type = "text" name = "website2">
<br>
<input type = "submit" name = "submit">
</form>
</body>
</html>
<?php
if (isset($_POST['submit']))
{
// form has been submitted
$url1 = $_POST['website1'];
$url2 = $_POST['website2'];
findAndCompare($url1, $url2);
}
else
{
}
function findAndCompare($url1, $url2)
{
libxml_use_internal_errors(true);
// Create a DOM parser object
$dom1 = new DOMDocument();
$dom2 = new DOMDocument();
$dom1->loadHTMLFile($url1);
$dom2->loadHTMLFile($url2);
$arr1 = array();
$arr2 = array();
$arr3 = array();
// Iterate over all the <a> tags
foreach($dom1->getElementsByTagName('a') as $link)
{
// insert the <a href> in arr1
array_push($arr1, $link->getAttribute('href'));
}
// Iterate over all the <a> tags
foreach($dom2->getElementsByTagName('a') as $link)
{
// insert the <a href> in arr2
array_push($arr2, $link->getAttribute('href'));
}
for ($i = 0; $i < count($arr1); $i++)
{
$max_elem = $arr2[0];
$max = 0;
for ($j = 0; $j < count($arr2); $j++)
{
similar_text($arr1[$i], $arr2[$j], $perc);
if ($perc > $max)
{
$max = $perc;
$max_elem = $arr2[$j];
}
}
$tmp = array($arr1[$i],$max_elem,$max);
array_push($arr3,$tmp);
}
function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');
// loop through the array
foreach($input_array as $line)
{
// use the default csv handler
fputcsv($temp_memory, $line, $delimiter);
}
fseek($temp_memory, 0);
// modify the header to be CSV format
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename = "' . $output_file_name . '";');
// output the file to be downloaded
fpassthru($temp_memory);
}
convert_to_csv($arr3, 'export.csv', ',');
}
?>
ОБНОВИТЬ
Я решаю это, поставив ob_clean();
перед header
HTML действительно будет выводиться, потому что это первое, что делает ваш код.
Как вы уже знаете, PHP позволяет смешивать HTML и код в одном файле с помощью маркеров <?php
и ?>
для обозначения начала и конца кода PHP.
Все, что находится за пределами этих маркеров, считается выводом и отправляется в браузер точно так же, как если бы вы использовали инструкцию print()
или echo()
.
Ваш код начинается с блока HTML, перед которым ничего нет. Это точно так же, как если бы вы запустили программу с оператором print()
, содержащим этот HTML.
Если вы не хотите, чтобы HTML выводился во всех случаях, вам понадобится код перед этим, чтобы сообщить, когда и нужно ли его выводить.
Вы не можете использовать header()
, если он уже есть.
Переместите форму html в первый оператор else.
Кроме того, не забудьте включить отчет об ошибках, потому что php вам это ясно дал бы.