6

HTMLの大きなチャンクを再フォーマットするために、PHP ( http://www.php.net/manual/en/book.tidy.php )の一部である HTML Tidy 実装を使用しようとしています。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() を使用することができます。オブジェクトを作成する前に 1 回実行し、オブジェクトを作成した後にもう一度実行して、2 つの結果の差をとります。( PHP でオブジェクトが使用するメモリを見つける方法は? (sizeof) )

  2. PHP tidy は、Linux の tidy プログラムのバージョンでブートストラップします。しばらく前に、プログラムに一度に入力できる文字数は 4096 文字に制限されていたことは知っています ( http://www.autoitscript.com/forum/topic/129973-tidy-4096-char-limit/ )。あたかもそのエラーが修正されたかのように。ただし、その理論をテストするためにお勧めするのは、10K 文字列をエコーアウトして (1 分かかります)、それを bash のきちんとしたプログラムで直接実行することです。私はこの理論を自分でテストすることにしました。

    BASH から、echo $(python -c 'print 20000*"a"') > test_file. 文字は 1 バイトなので、このコマンドは 20K のファイルを作成する必要があります。明らかに、これは tidy では検証されませんが、プログラムに投入できる素晴らしいジャンク テキストです。これを tidy に入力します (コマンド ラインに tidy がない場合sudo apt-get install tidy) tidy < 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);
    ?>
    

ジャンクファイルがエコーバックされ、基本的なHTMLファイルである「132」が返されるため、明らかにここで何か間違ったことをしています。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
    20001
  </body>
</html>

私は何か間違ったことをしていますが、この出力は、20K ファイルを切り捨てずに解析していることを示しています。

php test.phpこのコードは、プロンプトからの使用と Web ブラウザーからの実行の両方で試したことにも注意してください。同じ結果が得られます。切り捨てなし。Windows IIS ではなく、Ubuntu Server からこれを実行していることを明らかにすることも注目に値します。

変数をファイルに出力してから、それに対して tidy_repair_file() を実行してみてください。明らかに、このソリューションは持続可能ではなく、スケーリングされませんが、元の文字列に問題があるかどうかを通知します。

また、tidy 呼び出しの前後に $output で strlen() を実行してみてください。文字列が tidy に到達する前に 10K 文字列であることを確認してください...ちょうど健全性チェックとして。

頑張ってください。これが少しでも役立つことを願っています!

于 2013-04-06T09:43:40.933 に答える