4

私はphpの整頓されたライブラリを使用して、ユーザー入力からのいくつかのhtmlを「きれいにして修復」しています。

すべて正常に動作しますが、原因が分からないという問題が発生しています。私のコードは次のようなものです:

$tidy = new tidy();

    $tidy_options = array(
        'hide-comments' => true,'tidy-mark' => false, 'indent' => false,
        'new-blocklevel-tags' => 'article,footer,header,hgroup,output,progress,section,video',
        'new-inline-tags' => 'audio,details,time,ruby,rt,rp',
        'drop-empty-paras' => false, 
        'doctype' => '<!DOCTYPE HTML>',
        'sort-attributes' => 'none', 'vertical-space' => false,
        'output-xhtml' => true,'wrap' => 180,
        'wrap-attributes' => false,
        'break-before-br' => false,
        'show-body-only' => true
        );
$data = $tidy->repairString($data, $tidy_options, 'UTF8');
echo $data;

これは、swf ファイルを埋め込むために html を使用しようとしている場合を除いて、あらゆる種類の入力に対して機能します。
だから、私はこのコードを試します:

<object data="http://the_swf_file_url" type="application/x-shockwave-flash" width="853" height="520"> 
    <param name="movie" value="http://the_swf_file_url"> 
</object>

しかし、repairString はそのすべてを取り除き、空の文字列を返します。
最も奇妙なことは次のとおりです。
-上記と一緒にテキストを入力すると、入力は次のようHello world<object...>...</object>になり、正常に機能します。- または、指定した場合も
正常'show-body-only' => falseに動作します!

なぜこれが起こっているのですか?前もって感謝します。

編集:preserve-entitiesをtrueに設定してpankarの提案を試みましたが、運がありませんでした...

4

2 に答える 2

6

問題は、HTMLフラグメントを処理しようとしていることです。

これを行うと、ドキュメントの残りの部分が推測されます。構成をデフォルトのままにして、テキストの一部だけを含む整然としたドキュメントを出力すると、指定していないDOCTYPEhtmlheadおよびbodyタグが表示されます。これらのタグが存在する必要があると推測しました。

ここでの問題は、オブジェクトに関する HTML 仕様に次のように記載されていることです。

OBJECT 要素は、HEAD 要素のコンテンツにも表示される場合があります。

フラグメントの位置が推測されると、フラグメントが発生する可能性のある最初の場所に配置されます。これは、tidy がそれをheadタグに配置することを意味します。

が出力に影響を与える理由show-body-onlyは、フラグメントが に配置されなかったためbodyです。


ただしbody、テキストを追加すると、スニペットがタグに強制されます。これは、タグで生のテキストが許可されていないためです。headしたがって、フラグメントの論理的に推測される場所はbody.

私の意見では、利用可能な最良のオプションは、すべてのコード フラグメントを「テンプレート」ドキュメントに挿入し、後で再度解析することです。を使用すると、おそらくこれをかなり簡単に行うことができますDOMDocument

2 番目の解決策は、本体のみを表示するときに、後で再度削除できるセンチネル値を挿入することです。

いえ

____MY_MAGIC_TOKEN____
<object ...></object>

その後、もう一度剥がすことができます。

于 2012-08-02T10:54:35.963 に答える
3

構成オプションpreserve-entitiestrue(デフォルトでは) に指定してみてくださいfalse

編集

秒単位の (より徹底的な) 思考。これは予期される動作です。に設定show-body-onlyすることで、処理されたドキュメントのボディ部分を出力するようにtrue指示します。tidyxhtml

この設定は、実際に<head>はドキュメントのすべてを無視します。<object>コンポーネントは の子です<head>。指定するだけでこれを確認できます

$data = "<title>My Site</title>".

出力は再び空白になります。

接頭辞付きのテキストをタグに付けようとする試み<object>は、このデータをページの本文の一部として処理して表示する必要があると信じるようになるため、単純にだまされます。

今回はそれがさらに役立つことを願っています。

于 2012-07-26T13:28:38.523 に答える