PHP HTML Tidy:缓冲区大小限制

PHP HTML Tidy:缓冲区大小限制,php,htmltidy,Php,Htmltidy,我试图使用HTML Tidy实现,它是PHP()的一部分,以便重新格式化一大块HTML。我遇到了一个问题,Tidy将输出截断超过某个点(约8K) 当我创建一个大约10公里长的字符串并将其交给tidy_repair_字符串时,如下所示: $output = tidy_repair_string($output, array( 'indent' => true, // enforce indentation 'hide-comments' => true, // Re

我试图使用HTML Tidy实现,它是PHP()的一部分,以便重新格式化一大块HTML。我遇到了一个问题,Tidy将输出截断超过某个点(约8K)

当我创建一个大约10公里长的字符串并将其交给tidy_repair_字符串时,如下所示:

$output = tidy_repair_string($output, array( 
    'indent' => true, // enforce indentation 
    'hide-comments' => true, // Remove the comments 
    'wrap' => 100, // Break each line after 100 chars 
    'output-html' => true, // Output as HTML 
    'char-encoding' => $encoding // The input/output encoding 
), $encoding); 
我删掉了8070个字符后的所有内容。如果我在字符串的开头加上(比如)10个字符,那么末尾正好剩下10个字符。
有没有办法更改tidy_repair_字符串的缓冲区大小,使其更大?

看看这里似乎没有一个配置选项,谷歌显然没有什么帮助/我的谷歌fu让我失望了,关于这方面的文档也不多。任何帮助都将不胜感激


编辑:我正在Windows 7上使用xampp-portable-lite-win32-1.8.1-VC9。即使我将php.ini更改为使用memory_limit=900M,这个问题仍然会发生。好吧,我可以想出几个可能失败的原因

  • 您已经超过了内存限制,不仅仅是这个函数调用,而是将变量加载到内存中以及正在进行的任何预处理。为了测试这一点,您可以尝试将php.ini中的内存限制提高到非常高的水平,或者使用memory\u get\u usage()。 在创建对象之前运行一次,然后在创建对象之后再次运行,并计算两个结果之间的差异。()

  • PHP tidy正在Linux tidy程序的一个版本上启动。我知道不久前,程序一次只能输入4096个字符(),但看起来这个错误已经被修复了。不过,我建议对这个理论进行测试的方法是回显10K字符串(需要一分钟),然后直接通过bash的tidy程序运行它。我决定亲自测试这个理论:

    在BASH中,
    echo$(python-c'print 20000*“a”)>测试文件
    。因为char是1字节,所以这个命令应该为我们创建一个20K的文件。显然,这不会用tidy验证,但我可以在程序中抛出一些不错的垃圾文本。现在使用
    tidy
    将它输入到tidy(如果命令行上没有tidy,
    sudo apt get install tidy
    )。对我来说,这不会失败,但也许可以尝试一下。如果它没有失败,那么它不是特定于引导的bash程序

    *现在我们已经排除了php.ini和实际的bash-tidy程序的问题

  • 然后我试图重现你的错误

    我开始使用上面的注释,解析文件而不是字符串

    <?PHP
    $output = tidy_repair_file("test_file");
    
    print strlen($output);
    ?>
    
    <?PHP
    $data = readfile("test_file"); //read a 20K file into active memeory
    
    $encoding = "ascii"; //I just set my encoding to 'ascii' because I like it...
    
    $output = tidy_repair_string($data, array(
    'indent' => true, // enforce indentation
    'hide-comments' => true, // Remove the comments
    'wrap' => 100, // Break each line after 100 chars
    'output-html' => true, // Output as HTML
    'char-encoding' => $encoding // The input/output encoding
    ), $encoding);
    
    print strlen($output);
    ?>
    
    
    
    对于tidy_repair_文件strlen,我得到了20111(其中额外的111个字符来自tidy格式,没有截断)。 然后我尝试将它读入活动内存,并将其解析为字符串

    <?PHP
    $output = tidy_repair_file("test_file");
    
    print strlen($output);
    ?>
    
    <?PHP
    $data = readfile("test_file"); //read a 20K file into active memeory
    
    $encoding = "ascii"; //I just set my encoding to 'ascii' because I like it...
    
    $output = tidy_repair_string($data, array(
    'indent' => true, // enforce indentation
    'hide-comments' => true, // Remove the comments
    'wrap' => 100, // Break each line after 100 chars
    'output-html' => true, // Output as HTML
    'char-encoding' => $encoding // The input/output encoding
    ), $encoding);
    
    print strlen($output);
    ?>
    
    
    
  • 我在这里显然做错了什么,因为我得到了我的垃圾文件,然后是“132”,这是一个基本的HTML文件:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
    <html>
      <head>
        <title></title>
      </head>
      <body>
        20001
      </body>
    </html>
    
    
    20001
    
    当我做了一些错误的事情时,这个输出确实告诉我,我正在解析一个20K的文件而没有截断

    还值得注意的是,我在提示符下使用
    php test.php
    并通过web浏览器运行了这段代码。我得到了相同的结果。没有截断。我还需要注意的是,我在Ubuntu服务器上运行这段代码,而不是在Windows IIS上运行

    尝试将变量输出到文件,然后对其运行tidy_repair_file()。显然,此解决方案是不可持续的,不会扩展,但它会通知您原始字符串是否有问题

    另外,在tidy调用前后尝试在$output上运行strlen()——确保字符串在到达tidy之前是10K字符串……这是一个正常检查


    祝你好运,我希望这能有所帮助!

    可以保存到文件和解析文件中,而不是字符串?哇!非常感谢你全面、周到的回复!(我希望我有更多的投票:)。我用来测试这个问题的代码位于。步骤#1:我尝试将内存限制更改为900MB,在php.ini中使用memory#limit=900M。它还在发生。第2步:我不确定如何从命令行运行HTMLTidy,以便它使用php使用的php#u tidy.dll。第三步:你的帖子提醒我,我可能应该指定我在Windows上使用的平台-XAMPP。我会去编辑原来的帖子,把它弄清楚。