使用PHP

时间:2018-05-02 11:49:01

标签: php arrays string csv string-comparison

此代码通过从中获取所有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

2 个答案:

答案 0 :(得分:1)

确实会输出HTML,因为这是您的代码所做的第一件事。

如您所知,PHP允许在单个文件中混合使用HTML和代码,方法是使用<?php?>标记来表示PHP代码的开头和结尾。

这些标记之外的所有内容都被视为输出,并以与您使用print()echo()语句完全相同的方式发送到浏览器。

您的代码以HTML块开头,之前没有任何内容。这与使用包含此HTML的print()语句启动程序完全相同。

如果您不想在所有情况下输出HTML,那么您需要一些代码才能告诉它何时以及是否输出它。

答案 1 :(得分:0)

如果已有输出,则无法使用header()

将表单html移动到第一个else语句中。

此外,请确保启用错误报告,因为php会向您明确说明。