6

我正在尝试使用作为 PHP ( http://www.php.net/manual/en/book.tidy.php ) 一部分的 HTML Tidy 实现来重新格式化一大块 HTML。我遇到了一个问题,其中 Tidy 将输出截断超过某个点(大约 8K)。

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

$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); 

我在 8,070 个字符后删除了所有内容。如果我用 10 个字符填充字符串的开头,那么末尾正好有 10 个字符。
有没有办法改变 tidy_repair_string 的缓冲区大小,使其更大?

查看http://www.php.net/manual/en/tidy.getconfig.php似乎没有配置选项,Google 非常无用/我的 Google-fu 让我失望了,而且没有大量有关此的文档。任何帮助将不胜感激!

编辑:我在 Windows 7 上使用 xampp-portable-lite-win32-1.8.1-VC9。即使我将 php.ini 更改为使用 memory_limit = 900M,问题仍然存在

4

1 回答 1

1

好吧,我可以想到这可能会失败的几个原因。

  1. 你已经超出了你的内存限制,不仅仅是这个函数调用,而是将变量加载到内存和你正在做的任何预处理。要对此进行测试,您可以尝试将 php.ini 中的内存限制增加到非常高的值,或者您可以使用 memory_get_usage()。在创建对象之前运行一次,然后在创建对象后再次运行,并获取两个结果之间的差异。(如何在 PHP 中查找对象使用的内存?(sizeof)

  2. PHP tidy 在 Linux 的 tidy 程序的一个版本上进行引导。我知道不久前,该程序一次限制为 4096 个字符(http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/),但看起来好像该错误已被修复。不过,我建议只是测试该理论的方法是回显您的 10K 字符串(这需要一分钟),然后直接通过 bash 的 tidy 程序运行。我决定自己测试这个理论:

    来自 BASH echo $(python -c 'print 20000*"a"') > test_file,. 因为一个 char 是 1 个字节,这个命令应该为我们创建一个 20K 的文件。显然,这不会通过 tidy 进行验证,但它是一些不错的垃圾文本,我可以扔给程序。现在sudo apt-get install tidytidy < test_file. 对我来说,这不会失败,但也许试一试。如果它没有失败,那么它不是特定于引导的 bash tidy 程序。

    *现在我们已经消除了 php.ini 和实际的 bash tidy 程序作为问题。

  3. 然后我尝试重新创建您的错误。

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

    <?PHP
    $output = tidy_repair_file("test_file");
    
    print strlen($output);
    ?>
    

    对于 tidy_repair_file strlen,我得到了 20111(其中额外的 111 个字符来自整齐的格式。没有截断。然后我尝试将它读入活动内存并将其解析为字符串。

    <?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>

虽然我做错了,但这个输出确实告诉我我正在解析一个没有截断的 20K 文件。

还值得注意的是,我php test.php在提示符下使用并通过 Web 浏览器运行它都尝试了此代码。我得到相同的结果。没有截断。我还值得注意的是,我是在 Ubuntu Server 而非 Windows IIS 上运行它的。

尝试将变量输出到文件,然后对它运行 tidy_repair_file()。显然,这个解决方案是不可持续的,也不会扩展,但它会告诉你它是否是原始字符串的问题。

此外,尝试在您的 tidy 调用之前和之后在 $output 上运行 strlen() - 确保您的字符串是 10K 字符串,然后才能达到 tidy ......就像一个健全性检查。

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

于 2013-04-06T09:43:40.933 回答